আমি সি # তে স্কোয়ার-বন্ধনী অপারেটরটি কীভাবে ওভারলোড করব?


254

উদাহরণস্বরূপ ডেটাগ্রিডভিউ আপনাকে এটি করতে দেয়:

DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];

তবে আমার জীবনের জন্য আমি সূচি / স্কোয়ার-বন্ধনী অপারেটরে ডকুমেন্টেশন খুঁজে পাই না। তারা এটাকে কী বলে? এটি কোথায় বাস্তবায়িত হয়? এটা ফেলে দিতে পারে? আমি কীভাবে নিজের ক্লাসে একই জিনিস করতে পারি?

ইটিএ: সমস্ত দ্রুত উত্তরের জন্য ধন্যবাদ। সংক্ষেপে: সম্পর্কিত ডকুমেন্টেশনগুলি "আইটেম" সম্পত্তির অধীনে; ওভারলোডের উপায় হ'ল একটি সম্পত্তি ঘোষণার মাধ্যমে public object this[int x, int y]{ get{...}; set{...} }; ডেটাগ্রিডভিউয়ের জন্য সূচক কমপক্ষে ডকুমেন্টেশন অনুসারে নিক্ষেপ করে না। আপনি অবৈধ স্থানাঙ্ক সরবরাহ করলে কী হয় তা উল্লেখ করে না।

ইটিএ আবার: ঠিক আছে, যদিও ডকুমেন্টেশনে এর কোনও উল্লেখ করা হয়নি (দুষ্টু মাইক্রোসফ্ট!), এটি প্রমাণিত হয়েছে যে ডেটাগ্রিডভিউয়ের সূচকটি যদি অবৈধ স্থানাঙ্কের সাথে সরবরাহ করে তবে প্রকৃতপক্ষে একটি আর্গুমেন্টআউটঅফ্র্যাঞ্জএক্সসেপশন নিক্ষেপ করবে। ন্যায্য সতর্কতা.

উত্তর:


374

আপনি এটি এখানে কীভাবে করতে পারেন তা খুঁজে পেতে পারেন । সংক্ষেপে এটি:

public object this[int i]
{
    get { return InnerList[i]; }
    set { InnerList[i] = value; }
}

আপনার যদি কেবল নীচে উত্তরের বাক্যটির সিনট্যাক্সের প্রয়োজন হয় তবে তা সি ব্যবহার করা যেতে পারে (সি # 6 থেকে শুরু করে)।


9
একটি ছোট্ট মন্তব্য: আপনি যা করছেন তার উপর নির্ভর করে আপনি এটি করা আরও উপযুক্ত বলে মনে করতে পারেন: রিটার্ন বেস পাবেন [i]; } সেট {বেস [i] = মান; }
মাইকবাজ - এমএসএফটি

7
এটি অপারেটর ওভারলোডিং নয়। এটি সূচক
ডেস্ট্রাক্টর

5
সূচক, পাশাপাশি একটি অ্যানারি অপারেটর হতে পারে।
alan2 এখানে

1
2019 সালে, একটি নতুন উত্তর নির্বাচন করা উচিত, এটি একটি । খুব খারাপ এসওয়ের অবহেলিত উত্তরগুলির সাথে মোকাবিলা করার কোনও বৈশিষ্ট্য নেই, কারণ নতুনটি ৩৫০+ আপগ্রেস পাওয়ার কাছাকাছি নয়, যদিও এটি তাদের প্রাপ্য।
মিনিট

@ মিনস আমি অন্য উত্তরের একটি লিঙ্ক অন্তর্ভুক্ত করেছি।
রুবেন 1

41

এটি আইটেমের সম্পত্তি হবে: http://msdn.microsoft.com/en-us/library/0ebtbkkc.aspx

সম্ভবত এর মতো কিছু কাজ করবে:

public T Item[int index, int y]
{ 
    //Then do whatever you need to return/set here.
    get; set; 
}

অনেক ধন্যবাদ! আমি যদি দুটি উত্তর সেট করতে পারতাম তবে আমি
আপনারও যুক্ত করতাম

5
এটি কীভাবে বাস্তবায়িত হয় তার পরিপ্রেক্ষিতে এটি "আইটেম", তবে সি # পদে এটি "এটি"
মার্ক গ্র্যাভেল

1
ঠিক আছে, তবে আমি জিজ্ঞাসা করেছি "আমার জীবনের জন্য আমি সূচী / স্কোয়ার-বন্ধনী অপারেটরে নথিপত্র খুঁজে পাই না" - আমি বলতে চাইছিলাম আপনি যখন এমএসডিএন-তে একটি লাইব্রেরি ক্লাস দেখবেন, তখন তারা আপনাকে অপারেটর সম্পর্কে কোথায় বলবে? এ কারণেই আমি এটি সর্বশেষ "ইটিএ" তৈরি করেছিলাম যা এটি নিক্ষেপ করে - ডক্সটি ভুল
কোডার

26
Operators                           Overloadability

+, -, *, /, %, &, |, <<, >>         All C# binary operators can be overloaded.

+, -, !,  ~, ++, --, true, false    All C# unary operators can be overloaded.

==, !=, <, >, <= , >=               All relational operators can be overloaded, 
                                    but only as pairs.

&&, ||                  They can't be overloaded

() (Conversion operator)        They can't be overloaded

+=, -=, *=, /=, %=                  These compound assignment operators can be 
                                    overloaded. But in C#, these operators are
                                    automatically overloaded when the respective
                                    binary operator is overloaded.

=, . , ?:, ->, new, is, as, sizeof  These operators can't be overloaded

    [ ]                             Can be overloaded but not always!

তথ্য উত্স

বন্ধনী জন্য:

public Object this[int index]
{

}

কিন্তু

অ্যারে ইনডেক্সিং অপারেটরটিকে ওভারলোড করা যায় না ; তবে, প্রকারগুলি সূচকগুলি সংজ্ঞা দিতে পারে, এমন বৈশিষ্ট্য যা এক বা একাধিক পরামিতি নেয়। সূচক পরামিতিগুলি অ্যারে সূচকগুলির মতো বর্গাকার বন্ধনীগুলিতে আবদ্ধ থাকে, তবে সূচক পরামিতিগুলি যে কোনও ধরণের (অ্যারে সূচকগুলির বিপরীতে যা অবশ্যই অবিচ্ছেদ্য হতে পারে) হিসাবে ঘোষিত হতে পারে।

এমএসডিএন থেকে


হ্যাঁ এটি ওভারলোড করা যায়, যতক্ষণ না প্যারামিটারের স্বাক্ষর অন্যরকম, অন্য যে কোনও পদ্ধতির ওভারলোডিং বিধিনিষেধের মতো
চার্লস ব্রেটানা

এটি পারে, তবে আমি যে শর্তটি লিখেছিলাম তা নয়। এটি এমএসডিএন থেকে এসেছে। আপনি যদি আমাকে বিশ্বাস না করেন তবে উত্সটি পরীক্ষা করুন
প্যাট্রিক দেশজার্ডিনস

1
দুঃখিত আমি যদি আপনার পোস্টটি ভুলভাবে পড়ে থাকি তবে আপনি কোন শর্তটি উল্লেখ করছেন?
চার্লস ব্রেটানা

সহজ তালিকা জন্য +1। এফওয়াইআই লিঙ্কটি মারা গেল। (4 বছর পরে, আমি জানি)
মিক্স্সিফয়েড

আমি যুক্ত করতে চাই যে আপনি এখন সি # তে অন্তর্ভুক্ত এবং স্পষ্টত উভয় টাইপ-কাস্টিংকে ওভাররাইড করতে পারেন।
Felype

9

আপনি যদি সি # 6 বা তার পরে ব্যবহার করেন তবে আপনি কেবলমাত্র ইনডেক্সের জন্য এক্সপ্রেশন-বডিড সিনট্যাক্স ব্যবহার করতে পারেন:

public object this[int i] => this.InnerList[i];


6
public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}

5
প্রকৃতপক্ষে, এটি সত্যিই বিপজ্জনক - আপনার এখন দুটি প্রতিযোগিতামূলক বাস্তবায়ন রয়েছে: তালিকা <T> বা আইলিস্ট <টি> বা আইলিস্ট ইত্যাদির মত চলকযুক্ত যে কেউ আপনার কাস্টম কোডটি কার্যকর করবেন না।
মার্ক গ্র্যাভেল

1
সম্মত - অন্য কিছু না হলে তালিকা থেকে আপনার কাস্টম সংগ্রহ সংগ্রহ করা প্রয়োজন নয়, তবে আমি বুঝতে পারি নি যে এটি আসলে বিপজ্জনক ছিল
কোডার

এটি এখনও কাস্টম কোডটি কার্যকর করবে, তাই না? আপনি কোন পরিবর্তনশীল প্রকারটি ঘোষণা করেন তা বিবেচ্য নয় - এটি যে বিষয়টির জন্য গুরুত্বপূর্ণ তা এটি।
izb

1
সি # পলিমারফিজমের বন্ধুত্বপূর্ণ অনুস্মারক: এটি ঘটে কারণ বেস ক্লাসটি এর প্রয়োগটিকে ভার্চুয়াল হিসাবে ঘোষণা করে না। যদি এটি ভার্চুয়াল হিসাবে ঘোষণা করা হয় তবে প্রতিটি ক্ষেত্রেই কাস্টম কোডটি কল করা হবে।
almulo

1
উভয় সূচক অ-ভার্চুয়াল হওয়ায় এই কোডটি আপনাকে একটি সংকলক সতর্কতা দেবে। সংকলকটি আপনাকে newকীওয়ার্ডটির সাহায্যে আপনার কাস্টম ইনডেক্সারকে যোগ্য করে তোলার পরামর্শ দেবে ।
amoss

4

সিএলআই সি ++ এর জন্য (/ ক্লার সাথে সংকলিত) এই এমএসডিএন লিঙ্কটি দেখুন

সংক্ষেপে, একটি সম্পত্তি "ডিফল্ট" নাম দেওয়া যেতে পারে:

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};

2

অভ্যন্তরীণ তালিকা অবজেক্ট থেকে কোনও মান ফেরত দেওয়ার একটি উদাহরণ এখানে। আপনার ধারণা দেওয়া উচিত।

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }

1

যদি আপনি অ্যারে সূচক বলতে বোঝেন, ,, আপনি কেবলমাত্র একটি সূচক বৈশিষ্ট্য লিখে এটি ওভারলোড করে রাখেন .. এবং আপনি যখনই প্রত্যেকের পৃথক প্যারামিটার স্বাক্ষর থাকে ততক্ষণ সূচক বৈশিষ্ট্যগুলি ওভারলোড করতে পারেন (যতগুলি আপনি চান হিসাবে লিখুন)

public class EmployeeCollection: List<Employee>
{
    public Employee this[int employeeId]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.EmployeeId == employeeId)
                    return emp;
            }

            return null;
        }
    }

    public Employee this[string employeeName]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.Name == employeeName)
                    return emp;
            }

            return null;
        }
    }
}

2
প্রথমত, আপনি এর অর্থ []] এটি নয় (এটি)) - তবে কোনও তালিকার (আইলিস্ট / আইলিস্ট <T> / তালিকা <T>) একটি কাস্টম (তবে ভিন্ন) সরবরাহ করা বেশ বিপজ্জনক - এবং "ইনড ইনডেক্স" এবং "ইনটি কর্মচারীআইডি" সংস্করণগুলির মধ্যে সূক্ষ্ম বাগগুলি আনতে পারে। উভয় এখনও কল হয়।
মার্ক গ্র্যাভেল

এবং প্রকৃতপক্ষে, আমি মনে করি না যে আমি উপরে কোডটি প্রবেশ করিয়েছি তা কোনও নতুন বা ওভাররাইড স্টেটমেন্ট যুক্ত না করে সংকলন করবে কারণ তালিকার <T> এই [অন্তর্] প্রয়োগের অস্তিত্বের কারণে। আপনি যখন এটি করছেন তখন সম্ভাবনা সম্পর্কে সঠিক, কেবলমাত্র এটি বোঝানো সূচককে ওভারলোডিংয়ের উদাহরণ হিসাবে বোঝানো হয়েছিল।
চার্লস ব্রেটানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.