هل من الممكن تغيير القيمة الافتراضية لنوع البيانات البدائية؟

StackOverflow https://stackoverflow.com/questions/1604213

سؤال

لقد قمت مؤخرًا بإنشاء مصفوفة عامةu003CT> الفئة التي تعمل كركبة حول قائمة u003CListu003CT> > جمع. بقدر ما أستطيع أن أقول ، هذا الفصل يعمل بشكل مثالي. أنا أواجه مشكلة بسيطة على الرغم من القيم الافتراضية لـ T's.

أقوم بإنشاء مثيل من المصفوفةu003Cint> (3 ، 3) ، والتي تنشئ مصفوفة 3x3 من ints ، جميعها تقف إلى 0 باستخدام الافتراضي (t). أعلم أن أنواع القيمة (التي تشمل البدائية) افتراضية إلى ما يعادل 0 ، وأنواع المرجع الافتراضية إلى NULL. كنت أتساءل عما إذا كان من الممكن تغيير هذه القيمة الافتراضية بحيث إذا تم تمرير نوع القيمة إلى المصفوفة ، فسيتم ملؤها بـ 5 على سبيل المثال ، بدلاً من 0.

لقد حاولت إنشاء بنيتي (نوع القيمة) ، ولكن نظرًا لعدم القدرة على استخدام مُنشئات بدون معلمات داخل الهياكل ، لا يمكنني العثور على طريقة لتغيير القيمة الافتراضية من 0.

أظن أن تغيير القيمة الافتراضية غير ممكن ، وسوف يتعين عليّ حلاقة خلية المصفوفة عن طريق الخلية بعد أن تم إنشاء مثيل لها ، لكنني أردت أن أسأل هنا فقط في حالة القيام بذلك.

هل كانت مفيدة؟

المحلول

 public Matrix(int width, int height) : this(width, height, default(T)) {}
 public Matrix(int width, int height, T defaultValue)
 {
     List<T> rows = new List<T>(height);
     for (int i = 0; i < height; i++)
     {
         List<T> columns = new List<T>(width);
         for (int j = 0; j < width; j++)
         { columns.Add(defaultValue); }
         rows.Add(columns);
     }
     // store `rows` wherever you are storing it internally.
 }

ولكن كما يقول جوزيف ، لا توجد طريقة لتحديد ما default(T) يقيم.

نصائح أخرى

لا توجد طريقة لتغيير القيمة الافتراضية مثل كيفية وصفك.

var someInt = default(int); //this will always be 0, you can't change it
var someReference = default(SomeClass); //this will always be null

ها هو مقال MSDN على ذلك ، على الرغم من أنها ليست وصفية أكثر بكثير مما قيل بالفعل للأسف.

يمكنك عمل بنية تغلف قيمتها وتكشفها فقط مع إزاحة القيمة الافتراضية التي تريدها:

public struct DefaultFiveInteger {

   private int _value;

   public DefaultFiveInteger(int value) {
      _value = x - 5;
   }

   public static implicit operator int(DefaultFiveInteger x) {
      return x._value + 5;
   }

   public static implicit operator DefaultFiveInteger(int x) {
      return new DefaultFiveInteger(x);
   }

}

يمكنك الآن إعلان متغير يتم تهيئته إلى القيمة الافتراضية (0) ، وسيعود القيمة مع الإزاحة:

DefaultFiveInteger x;
Console.Write(x);

انتاج:

5

حسنًا ، نظرًا لأنك تنظر إلى الهياكل بالفعل ، يمكنك محاكاة القيمة الافتراضية على النحو التالي:

public struct MyInt
{
    private int _defaultInt;
    public int DefaultInt
    {
        get
        {
            if (_defaultInt == 0)
                return 5;
            else
                return _defaultInt;
        }
        set
        {
            _defaultInt = value;
        }
    }
}

فهمي لتنفيذ default(T) هو أن وقت التشغيل ، افتراضيًا ، أفرغ الذاكرة حيث يطلب التطبيق لها ، و C# يخصص المساحة دون الكتابة فوق الأصفار. يحدث فقط أن القيم الافتراضية للأنواع غير الرقمية (على سبيل المثال المرجع الفارغ ، الخاطئة) يتم تمثيلها كأصفار في الذاكرة. هذا يمكن أن يؤدي إلى بعض السلوك الغريب. فمثلا، default(MyEnumType) سيكون صفرًا حتى لو لم تحدد أبدًا قيمة التعداد لتكون مساوية للصفر.

الجمع بين أفكار Guffa و Dougjones ، يمكنك تعويض عضو دعم العقارات.

public struct MyInt
{
    private const int INT_DEFAULT = 5;
    private int _defaultInt;
    public int DefaultInt
    {
        get { return _defaultInt + INT_DEFAULT; }
        set { _defaultInt = value - INT_DEFAULT; }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top