C # kompleksi boshlang'ichi yangi kalit so'zsiz kompilyatsiya qilinadi

Yaqinda ba'zi kodlar ustida ishladim, u kasrni ishlatishdan o'nli raqamga ega bo'lgan murakkab bir turini ishlatish uchun va bir qismni ifodalash uchun turini o'zgartirgan. Ba'zi testlarni yangilashim kerak edi, va yozish paytida, new kalit so'zini qo'shishni unutibman. Kod olingan, ammo test muvaffaqiyatsiz tugadi va NullReferenceExceptionni tashladi. U erda men yo'qolgan yangi narsani va mulkning boshlanmasligini tushunib etdim. Hech kimga nima uchun bunday fikr bor? Buni tushuntiradigan C# lang spetsifikatsiyasida hech narsa topolmadim.

Quyidagi kod misoli:

public class Fraction 
{
    public int Numerator { get; set; }
    public int Denominator { get; set; }
}

public class MyDecimal
{
    public decimal? Decimal { get; set; }     
    public Fraction Fractional { get; set; }
}

public class ClassA 
{
    public MyDecimal Value { get; set; }
}

//...

var instance = new ClassA
{
     Value =//new MyDecimal is missing here
     {
         Decimal = 2.0m,
         Fractional = new Fraction 
         { 
               Numerator = 3,   
               Denominator = 4 
         }
     }
}

Iltimos, C# 6 va VS 2015 dan foydalanayotganimni unutmang, lekin LINQPad da xuddi shu natijani ham qo'lga kiritaman.

Agar buni kimdir tushuntirsa (Jon Skeetga qaratganman :)) men xursand bo'lardim.

7
Taqqoslash, agar = new MyDecimal qismini kamsatsangiz, kompilyator Value ni allaqachon mavjud ob'ektga havola qilishni kutadi va uni shunchaki uning ichiga kirib, Decimal va Fractional kabi xususiyatlarni belgilash. Shuning uchun siz NRE olishingiz mumkin. Buni Value deklaratsiya ga qo'shsangiz, u ishlaydi, lekin ehtimol siz xohlamasangiz: {get; to'siq; } = Yangi MyDecimal ();
qo'shib qo'ydi muallif Lasse Vågsæther Karl, manba
Taqqoslash, agar = new MyDecimal qismini kamsatsangiz, kompilyator Value ni allaqachon mavjud ob'ektga havola qilishni kutadi va uni shunchaki uning ichiga kirib, Decimal va Fractional kabi xususiyatlarni belgilash. Shuning uchun siz NRE olishingiz mumkin. Buni Value deklaratsiya ga qo'shsangiz, u ishlaydi, lekin ehtimol siz xohlamasangiz: {get; to'siq; } = Yangi MyDecimal ();
qo'shib qo'ydi muallif Lasse Vågsæther Karl, manba
Taqqoslash, agar = new MyDecimal qismini kamsatsangiz, kompilyator Value ni allaqachon mavjud ob'ektga havola qilishni kutadi va uni shunchaki uning ichiga kirib, Decimal va Fractional kabi xususiyatlarni belgilash. Shuning uchun siz NRE olishingiz mumkin. Buni Value deklaratsiya ga qo'shsangiz, u ishlaydi, lekin ehtimol siz xohlamasangiz: {get; to'siq; } = Yangi MyDecimal ();
qo'shib qo'ydi muallif Lasse Vågsæther Karl, manba
Ob'ektni boshlovchi - siz izlayotgan atamadir. Bu boshlanuvchilarni keyin deb nomlanadi, tegishli sinfning konstruktori chaqirildi. Ammo Value bir NullReference qilishni istamasangiz, ushbu konstruktorni chaqirmagan new kalit so'zini unutganingizdek, sizning holatingizda.
qo'shib qo'ydi muallif HimBromBeere, manba
@ LasseV.Karlsen, lekin shunga o'xshash kodni tuzish nima uchun boshqa savol
qo'shib qo'ydi muallif Selman Genç, manba
@ LasseV.Karlsen, lekin shunga o'xshash kodni tuzish nima uchun boshqa savol
qo'shib qo'ydi muallif Selman Genç, manba
@ LasseV.Karlsen, lekin shunga o'xshash kodni tuzish nima uchun boshqa savol
qo'shib qo'ydi muallif Selman Genç, manba
@ LasseV.Karlsen, lekin shunga o'xshash kodni tuzish nima uchun boshqa savol
qo'shib qo'ydi muallif Selman Genç, manba
Nima uchun bu savol ikki nusxada belgilangan? Shubhasiz, yangi kalit so'z nima uchun talab qilinmaydi, ob'ekt boshlang'ichlarini qanday ishlatish haqida haqiqiy savol emas ...
qo'shib qo'ydi muallif nbokmans, manba
@ SelmanGench Um, yo'q, Lasse ham buni tushuntirib berdi. Agar Value allaqachon ishga tushirilgan bo'lsa (masalan, ClassA ning sinf ishlab chiqaruvchisida), uni boshqa misol bilan almashtirmoqchi emassiz, faqatgina xususiyatlarni tayinlang. Bu ochiq-oydin bo'lib, C# xususiyatiga ega.
qo'shib qo'ydi muallif Luaan, manba
@ SelmanGench Um, yo'q, Lasse ham buni tushuntirib berdi. Agar Value allaqachon ishga tushirilgan bo'lsa (masalan, ClassA ning sinf ishlab chiqaruvchisida), uni boshqa misol bilan almashtirmoqchi emassiz, faqatgina xususiyatlarni tayinlang. Bu ochiq-oydin bo'lib, C# xususiyatiga ega.
qo'shib qo'ydi muallif Luaan, manba
@ SelmanGench Um, yo'q, Lasse ham buni tushuntirib berdi. Agar Value allaqachon ishga tushirilgan bo'lsa (masalan, ClassA ning sinf ishlab chiqaruvchisida), uni boshqa misol bilan almashtirmoqchi emassiz, faqatgina xususiyatlarni tayinlang. Bu ochiq-oydin bo'lib, C# xususiyatiga ega.
qo'shib qo'ydi muallif Luaan, manba
@ SelmanGench Um, yo'q, Lasse ham buni tushuntirib berdi. Agar Value allaqachon ishga tushirilgan bo'lsa (masalan, ClassA ning sinf ishlab chiqaruvchisida), uni boshqa misol bilan almashtirmoqchi emassiz, faqatgina xususiyatlarni tayinlang. Bu ochiq-oydin bo'lib, C# xususiyatiga ega.
qo'shib qo'ydi muallif Luaan, manba

12 javoblar

C # xarakteristikasi 5.0 obyekt boshlanuvchini quyidagicha belgilaydi ( 7.6.10.2 ob'ekt boshlantiruvchi ):

Ob'ekt boshlang'ichi ob'ektning nol yoki bir nechta maydonchasi yoki xususiyatlariga tegishli qiymatlarni bildiradi.

  ob'ekt-initializer:
{member-initializer-listopt}
{Ishtirokchi-initializer-list}
 
-ni tanlang

Batafsil tavsifdan keyin sizning kodingizga juda o'xshash bir misol mavjud:

To'rtburchakning konstruktori ikkita o'rnatilgan nuqta namunalarini ajratadi

  umumiy sinfi Rectangle
{
  Point p1 = yangi nuqta ();
  Point p2 = yangi nuqta ();
  ommaviy nuqta P1 {get {return p1; }}
  ommaviy nuqta P2 {get {return p2; }}
}
 
-ni tanlang      

kiritilgan nuqtani ishga tushirish uchun quyidagi qurilma ishlatilishi mumkin   yangi nusxalarni o'rniga o'rniga:

  Rectangle r = yangi Rectangle {
  P1 = {X = 0, Y = 1},
  P2 = {X = 2, Y = 3}
};
 
-ni tanlang      

bilan bir xil ta'sirga ega

  Rectangle __r = yangi Rectangle ();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
To'rtburchak r = __r;
 
-ni tanlang

Ammo Rectangle asoschisi tarkibidagi Rectangle sinfida bu erda nuqta misollari faqat bitta farq mavjud.

Shunday qilib, sintaksisi spesifikatsiya asosida amal qiladi, lekin NRE'yi oldini olish uchun xususiyatlarini ishga tushirish uchun ob'ekt boshlang'ichini ishlatishdan oldin Value kodini tekshirish kerak.

5
qo'shib qo'ydi

C # xarakteristikasi 5.0 obyekt boshlanuvchini quyidagicha belgilaydi ( 7.6.10.2 ob'ekt boshlantiruvchi ):

Ob'ekt boshlang'ichi ob'ektning nol yoki bir nechta maydonchasi yoki xususiyatlariga tegishli qiymatlarni bildiradi.

  ob'ekt-initializer:
{member-initializer-listopt}
{Ishtirokchi-initializer-list}
 
-ni tanlang

Batafsil tavsifdan keyin sizning kodingizga juda o'xshash bir misol mavjud:

To'rtburchakning konstruktori ikkita o'rnatilgan nuqta namunalarini ajratadi

  umumiy sinfi Rectangle
{
  Point p1 = yangi nuqta ();
  Point p2 = yangi nuqta ();
  ommaviy nuqta P1 {get {return p1; }}
  ommaviy nuqta P2 {get {return p2; }}
}
 
-ni tanlang      

kiritilgan nuqtani ishga tushirish uchun quyidagi qurilma ishlatilishi mumkin   yangi nusxalarni o'rniga o'rniga:

  Rectangle r = yangi Rectangle {
  P1 = {X = 0, Y = 1},
  P2 = {X = 2, Y = 3}
};
 
-ni tanlang      

bilan bir xil ta'sirga ega

  Rectangle __r = yangi Rectangle ();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
To'rtburchak r = __r;
 
-ni tanlang

Ammo Rectangle asoschisi tarkibidagi Rectangle sinfida bu erda nuqta misollari faqat bitta farq mavjud.

Shunday qilib, sintaksisi spesifikatsiya asosida amal qiladi, lekin NRE'yi oldini olish uchun xususiyatlarini ishga tushirish uchun ob'ekt boshlang'ichini ishlatishdan oldin Value kodini tekshirish kerak.

5
qo'shib qo'ydi

C # xarakteristikasi 5.0 obyekt boshlanuvchini quyidagicha belgilaydi ( 7.6.10.2 ob'ekt boshlantiruvchi ):

Ob'ekt boshlang'ichi ob'ektning nol yoki bir nechta maydonchasi yoki xususiyatlariga tegishli qiymatlarni bildiradi.

  ob'ekt-initializer:
{member-initializer-listopt}
{Ishtirokchi-initializer-list}
 
-ni tanlang

Batafsil tavsifdan keyin sizning kodingizga juda o'xshash bir misol mavjud:

To'rtburchakning konstruktori ikkita o'rnatilgan nuqta namunalarini ajratadi

  umumiy sinfi Rectangle
{
  Point p1 = yangi nuqta ();
  Point p2 = yangi nuqta ();
  ommaviy nuqta P1 {get {return p1; }}
  ommaviy nuqta P2 {get {return p2; }}
}
 
-ni tanlang      

kiritilgan nuqtani ishga tushirish uchun quyidagi qurilma ishlatilishi mumkin   yangi nusxalarni o'rniga o'rniga:

  Rectangle r = yangi Rectangle {
  P1 = {X = 0, Y = 1},
  P2 = {X = 2, Y = 3}
};
 
-ni tanlang      

bilan bir xil ta'sirga ega

  Rectangle __r = yangi Rectangle ();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
To'rtburchak r = __r;
 
-ni tanlang

Ammo Rectangle asoschisi tarkibidagi Rectangle sinfida bu erda nuqta misollari faqat bitta farq mavjud.

Shunday qilib, sintaksisi spesifikatsiya asosida amal qiladi, lekin NRE'yi oldini olish uchun xususiyatlarini ishga tushirish uchun ob'ekt boshlang'ichini ishlatishdan oldin Value kodini tekshirish kerak.

5
qo'shib qo'ydi

C # xarakteristikasi 5.0 obyekt boshlanuvchini quyidagicha belgilaydi ( 7.6.10.2 ob'ekt boshlantiruvchi ):

Ob'ekt boshlang'ichi ob'ektning nol yoki bir nechta maydonchasi yoki xususiyatlariga tegishli qiymatlarni bildiradi.

  ob'ekt-initializer:
{member-initializer-listopt}
{Ishtirokchi-initializer-list}
 
-ni tanlang

Batafsil tavsifdan keyin sizning kodingizga juda o'xshash bir misol mavjud:

To'rtburchakning konstruktori ikkita o'rnatilgan nuqta namunalarini ajratadi

  umumiy sinfi Rectangle
{
  Point p1 = yangi nuqta ();
  Point p2 = yangi nuqta ();
  ommaviy nuqta P1 {get {return p1; }}
  ommaviy nuqta P2 {get {return p2; }}
}
 
-ni tanlang      

kiritilgan nuqtani ishga tushirish uchun quyidagi qurilma ishlatilishi mumkin   yangi nusxalarni o'rniga o'rniga:

  Rectangle r = yangi Rectangle {
  P1 = {X = 0, Y = 1},
  P2 = {X = 2, Y = 3}
};
 
-ni tanlang      

bilan bir xil ta'sirga ega

  Rectangle __r = yangi Rectangle ();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
To'rtburchak r = __r;
 
-ni tanlang

Ammo Rectangle asoschisi tarkibidagi Rectangle sinfida bu erda nuqta misollari faqat bitta farq mavjud.

Shunday qilib, sintaksisi spesifikatsiya asosida amal qiladi, lekin NRE'yi oldini olish uchun xususiyatlarini ishga tushirish uchun ob'ekt boshlang'ichini ishlatishdan oldin Value kodini tekshirish kerak.

5
qo'shib qo'ydi

Ob'ektni boshlashtiruvchi sizning a'zolaringizdan misol qilib keltirmaydi .

Quyidagi kodni ko'ring:

var myInstance = new MyInstance { MyMember = new MyMember { Value = 3 }; }

Bu quyidagilarni ichiga oladi:

var myMember= new MyMember();
myMember.MyMember = 3;
var myInstance = new MyInstance();
myInstance.MyMember = myMember;

Siz o'zingiz uchun ni yaratishni unutdingiz MyMember , shuning uchun ob'ekt intializer bu xususiyatga kirish ga harakat qiladi va unga qo'shimcha qiymatlarni belgilaydi. Buning sababi, ob'ekt boshlang'ichlari, keyin ni tegishli konstruktordan so'ng ishga tushirganligi sababli. Shunday qilib, sizning holatlaringizga ko'ra:

var myInstance = new MyInstance();
myMymber.MyMember = 3;

myMember sifatida NullReferenceException nima uchun yaratilganligi hech qachon aniqlanmagan.

Nima uchun bu hatto kompilyatsiya? Xullas, derleyici, MyMember MyInstance ning asoschisi ichidan yaratilganini ta'kidlaydi. Buni aslida qilgandek his qilolmaysiz.

class Instance
{
    MyMember MyMember = new MyMember();
}

null a'zolaridan ajralib chiqish, albatta, absoluetely to'g'ri.

2
qo'shib qo'ydi
@SlavenVukovic mening tahririmni ko'radi
qo'shib qo'ydi muallif HimBromBeere, manba
@SlavenVukovic - chunki uning ob'ekti qurilganidan keyin va a'zolik boshlang'ichi bajarilishidan oldin null bo'lmagan a'zolarga ega bo'lishi uchun juda yaxshi.
qo'shib qo'ydi muallif Damien_The_Unbeliever, manba
@HimBromBeere Bu butunlay ma'nosini beradi, derleyici, konstruktorda xususiyatni ishga tushirganmisiz yoki yo'qligini aniqlay olmaydi. Men hali ham biroz yomon ekanini tan olaman va siz bu erda yangi kalit so'zni topishga majbur bo'lishingiz kerak, ammo bu yana bir hikoya. Javobingiz uchun tashakkur! Mystika hal qilindi.
qo'shib qo'ydi muallif Slaven Vukovic, manba
Yup, bu butunlay ma'nosini beradi, lekin mening savolim nimani anglatadi, nima uchun bu tuzilish kompilyatsiya qiladi, chunki aniq ko'rinmaydigan (yoki hech bo'lmaganda kompilyator ogohlantiruvchi bo'lishi kerak)? Yoki boshqa tomondan, agar bunday qurilish tilda mavjud bo'lsa, unda qanday foydalaniladi?
qo'shib qo'ydi muallif Slaven Vukovic, manba

Ob'ektni boshlashtiruvchi sizning a'zolaringizdan misol qilib keltirmaydi .

Quyidagi kodni ko'ring:

var myInstance = new MyInstance { MyMember = new MyMember { Value = 3 }; }

Bu quyidagilarni ichiga oladi:

var myMember= new MyMember();
myMember.MyMember = 3;
var myInstance = new MyInstance();
myInstance.MyMember = myMember;

Siz o'zingiz uchun ni yaratishni unutdingiz MyMember , shuning uchun ob'ekt intializer bu xususiyatga kirish ga harakat qiladi va unga qo'shimcha qiymatlarni belgilaydi. Buning sababi, ob'ekt boshlang'ichlari, keyin ni tegishli konstruktordan so'ng ishga tushirganligi sababli. Shunday qilib, sizning holatlaringizga ko'ra:

var myInstance = new MyInstance();
myMymber.MyMember = 3;

myMember sifatida NullReferenceException nima uchun yaratilganligi hech qachon aniqlanmagan.

Nima uchun bu hatto kompilyatsiya? Xullas, derleyici, MyMember MyInstance ning asoschisi ichidan yaratilganini ta'kidlaydi. Buni aslida qilgandek his qilolmaysiz.

class Instance
{
    MyMember MyMember = new MyMember();
}

null a'zolaridan ajralib chiqish, albatta, absoluetely to'g'ri.

2
qo'shib qo'ydi
@SlavenVukovic mening tahririmni ko'radi
qo'shib qo'ydi muallif HimBromBeere, manba
@SlavenVukovic - chunki uning ob'ekti qurilganidan keyin va a'zolik boshlang'ichi bajarilishidan oldin null bo'lmagan a'zolarga ega bo'lishi uchun juda yaxshi.
qo'shib qo'ydi muallif Damien_The_Unbeliever, manba
@HimBromBeere Bu butunlay ma'nosini beradi, derleyici, konstruktorda xususiyatni ishga tushirganmisiz yoki yo'qligini aniqlay olmaydi. Men hali ham biroz yomon ekanini tan olaman va siz bu erda yangi kalit so'zni topishga majbur bo'lishingiz kerak, ammo bu yana bir hikoya. Javobingiz uchun tashakkur! Mystika hal qilindi.
qo'shib qo'ydi muallif Slaven Vukovic, manba
Yup, bu butunlay ma'nosini beradi, lekin mening savolim nimani anglatadi, nima uchun bu tuzilish kompilyatsiya qiladi, chunki aniq ko'rinmaydigan (yoki hech bo'lmaganda kompilyator ogohlantiruvchi bo'lishi kerak)? Yoki boshqa tomondan, agar bunday qurilish tilda mavjud bo'lsa, unda qanday foydalaniladi?
qo'shib qo'ydi muallif Slaven Vukovic, manba

Ob'ektni boshlashtiruvchi sizning a'zolaringizdan misol qilib keltirmaydi .

Quyidagi kodni ko'ring:

var myInstance = new MyInstance { MyMember = new MyMember { Value = 3 }; }

Bu quyidagilarni ichiga oladi:

var myMember= new MyMember();
myMember.MyMember = 3;
var myInstance = new MyInstance();
myInstance.MyMember = myMember;

Siz o'zingiz uchun ni yaratishni unutdingiz MyMember , shuning uchun ob'ekt intializer bu xususiyatga kirish ga harakat qiladi va unga qo'shimcha qiymatlarni belgilaydi. Buning sababi, ob'ekt boshlang'ichlari, keyin ni tegishli konstruktordan so'ng ishga tushirganligi sababli. Shunday qilib, sizning holatlaringizga ko'ra:

var myInstance = new MyInstance();
myMymber.MyMember = 3;

myMember sifatida NullReferenceException nima uchun yaratilganligi hech qachon aniqlanmagan.

Nima uchun bu hatto kompilyatsiya? Xullas, derleyici, MyMember MyInstance ning asoschisi ichidan yaratilganini ta'kidlaydi. Buni aslida qilgandek his qilolmaysiz.

class Instance
{
    MyMember MyMember = new MyMember();
}

null a'zolaridan ajralib chiqish, albatta, absoluetely to'g'ri.

2
qo'shib qo'ydi
@SlavenVukovic mening tahririmni ko'radi
qo'shib qo'ydi muallif HimBromBeere, manba
@SlavenVukovic - chunki uning ob'ekti qurilganidan keyin va a'zolik boshlang'ichi bajarilishidan oldin null bo'lmagan a'zolarga ega bo'lishi uchun juda yaxshi.
qo'shib qo'ydi muallif Damien_The_Unbeliever, manba
@HimBromBeere Bu butunlay ma'nosini beradi, derleyici, konstruktorda xususiyatni ishga tushirganmisiz yoki yo'qligini aniqlay olmaydi. Men hali ham biroz yomon ekanini tan olaman va siz bu erda yangi kalit so'zni topishga majbur bo'lishingiz kerak, ammo bu yana bir hikoya. Javobingiz uchun tashakkur! Mystika hal qilindi.
qo'shib qo'ydi muallif Slaven Vukovic, manba
Yup, bu butunlay ma'nosini beradi, lekin mening savolim nimani anglatadi, nima uchun bu tuzilish kompilyatsiya qiladi, chunki aniq ko'rinmaydigan (yoki hech bo'lmaganda kompilyator ogohlantiruvchi bo'lishi kerak)? Yoki boshqa tomondan, agar bunday qurilish tilda mavjud bo'lsa, unda qanday foydalaniladi?
qo'shib qo'ydi muallif Slaven Vukovic, manba

Ob'ektni boshlashtiruvchi sizning a'zolaringizdan misol qilib keltirmaydi .

Quyidagi kodni ko'ring:

var myInstance = new MyInstance { MyMember = new MyMember { Value = 3 }; }

Bu quyidagilarni ichiga oladi:

var myMember= new MyMember();
myMember.MyMember = 3;
var myInstance = new MyInstance();
myInstance.MyMember = myMember;

Siz o'zingiz uchun ni yaratishni unutdingiz MyMember , shuning uchun ob'ekt intializer bu xususiyatga kirish ga harakat qiladi va unga qo'shimcha qiymatlarni belgilaydi. Buning sababi, ob'ekt boshlang'ichlari, keyin ni tegishli konstruktordan so'ng ishga tushirganligi sababli. Shunday qilib, sizning holatlaringizga ko'ra:

var myInstance = new MyInstance();
myMymber.MyMember = 3;

myMember sifatida NullReferenceException nima uchun yaratilganligi hech qachon aniqlanmagan.

Nima uchun bu hatto kompilyatsiya? Xullas, derleyici, MyMember MyInstance ning asoschisi ichidan yaratilganini ta'kidlaydi. Buni aslida qilgandek his qilolmaysiz.

class Instance
{
    MyMember MyMember = new MyMember();
}

null a'zolaridan ajralib chiqish, albatta, absoluetely to'g'ri.

2
qo'shib qo'ydi
@SlavenVukovic mening tahririmni ko'radi
qo'shib qo'ydi muallif HimBromBeere, manba
@SlavenVukovic - chunki uning ob'ekti qurilganidan keyin va a'zolik boshlang'ichi bajarilishidan oldin null bo'lmagan a'zolarga ega bo'lishi uchun juda yaxshi.
qo'shib qo'ydi muallif Damien_The_Unbeliever, manba
@HimBromBeere Bu butunlay ma'nosini beradi, derleyici, konstruktorda xususiyatni ishga tushirganmisiz yoki yo'qligini aniqlay olmaydi. Men hali ham biroz yomon ekanini tan olaman va siz bu erda yangi kalit so'zni topishga majbur bo'lishingiz kerak, ammo bu yana bir hikoya. Javobingiz uchun tashakkur! Mystika hal qilindi.
qo'shib qo'ydi muallif Slaven Vukovic, manba
Yup, bu butunlay ma'nosini beradi, lekin mening savolim nimani anglatadi, nima uchun bu tuzilish kompilyatsiya qiladi, chunki aniq ko'rinmaydigan (yoki hech bo'lmaganda kompilyator ogohlantiruvchi bo'lishi kerak)? Yoki boshqa tomondan, agar bunday qurilish tilda mavjud bo'lsa, unda qanday foydalaniladi?
qo'shib qo'ydi muallif Slaven Vukovic, manba

Ob'ektni ishga tushirishning sintaksisi ob'ektni avval yaratmasdan ishga tushirishga imkon beradi. Ob'ekt identifikatorini saqlamoqchi bo'lsangiz, bu juda muhimdir.

Misol uchun, ClassA.Value faqat o'qish uchun xususiyatni yaratishingiz mumkin va uni ob'ekt quruvchisi sifatida ishga tushirishingiz mumkin:

public class ClassA 
{
  public ClassA() 
  {
    Value = new MyDecimal();
  }

  public MyDecimal Value { get; private set; }
}

Ushbu xatti-harakatlar, albatta, C# spetsifikatsiyasida aniq ko'rsatilgan (5-versiyadan olingan paragraf):

7.6.10.2 ob'ekt boshlang'ichlari

     

Teng belgisidan keyin ifodani bildiradigan element kirituvchisi bu maydon yoki mulkka tayinlanish (§ 7.17.1) bilan bir xil tarzda ishlanadi.

     

tenglik belgisi keyin ob'ekt boshlang'ichini belgilaydigan a'zolar boshlang'ichi ichki o'rnatilgan ob'ekt boshlang'ichi, ya'ni katıştırılmış ob'ektni ishga tushirilishi. Maydondagi yoki mulkga yangi qiymat tayinlash o'rniga, ichki o'tgan ob'ekt boshlang'ichidagi topshiriqlar maydon yoki mulk a'zolariga tayinlash sifatida ko'rib chiqiladi. Nested ob'ekt boshlang'ichlari qiymat turiga ega xususiyatlarga yoki qiymat turi bilan faqat o'qish uchun ishlatilishi mumkin emas.

Sizning Value initializer inizatsiya qilingan boshlang'ich bo'lsa, Value sozlamasi ishga tushirilganda, uni faqat Value a'zolarini belgilashga ruxsat berishga imkon beradi. Albatta, allaqachon. Derleyici, Value null yoki yo'qligini tekshirish uchun hech qanday usuli yo'q, shuning uchun sizga xato bera olmaydi.

2
qo'shib qo'ydi

Ob'ektni ishga tushirishning sintaksisi ob'ektni avval yaratmasdan ishga tushirishga imkon beradi. Ob'ekt identifikatorini saqlamoqchi bo'lsangiz, bu juda muhimdir.

Misol uchun, ClassA.Value faqat o'qish uchun xususiyatni yaratishingiz mumkin va uni ob'ekt quruvchisi sifatida ishga tushirishingiz mumkin:

public class ClassA 
{
  public ClassA() 
  {
    Value = new MyDecimal();
  }

  public MyDecimal Value { get; private set; }
}

Ushbu xatti-harakatlar, albatta, C# spetsifikatsiyasida aniq ko'rsatilgan (5-versiyadan olingan paragraf):

7.6.10.2 ob'ekt boshlang'ichlari

     

Teng belgisidan keyin ifodani bildiradigan element kirituvchisi bu maydon yoki mulkka tayinlanish (§ 7.17.1) bilan bir xil tarzda ishlanadi.

     

tenglik belgisi keyin ob'ekt boshlang'ichini belgilaydigan a'zolar boshlang'ichi ichki o'rnatilgan ob'ekt boshlang'ichi, ya'ni katıştırılmış ob'ektni ishga tushirilishi. Maydondagi yoki mulkga yangi qiymat tayinlash o'rniga, ichki o'tgan ob'ekt boshlang'ichidagi topshiriqlar maydon yoki mulk a'zolariga tayinlash sifatida ko'rib chiqiladi. Nested ob'ekt boshlang'ichlari qiymat turiga ega xususiyatlarga yoki qiymat turi bilan faqat o'qish uchun ishlatilishi mumkin emas.

Sizning Value initializer inizatsiya qilingan boshlang'ich bo'lsa, Value sozlamasi ishga tushirilganda, uni faqat Value a'zolarini belgilashga ruxsat berishga imkon beradi. Albatta, allaqachon. Derleyici, Value null yoki yo'qligini tekshirish uchun hech qanday usuli yo'q, shuning uchun sizga xato bera olmaydi.

2
qo'shib qo'ydi

Ob'ektni ishga tushirishning sintaksisi ob'ektni avval yaratmasdan ishga tushirishga imkon beradi. Ob'ekt identifikatorini saqlamoqchi bo'lsangiz, bu juda muhimdir.

Misol uchun, ClassA.Value faqat o'qish uchun xususiyatni yaratishingiz mumkin va uni ob'ekt quruvchisi sifatida ishga tushirishingiz mumkin:

public class ClassA 
{
  public ClassA() 
  {
    Value = new MyDecimal();
  }

  public MyDecimal Value { get; private set; }
}

Ushbu xatti-harakatlar, albatta, C# spetsifikatsiyasida aniq ko'rsatilgan (5-versiyadan olingan paragraf):

7.6.10.2 ob'ekt boshlang'ichlari

     

Teng belgisidan keyin ifodani bildiradigan element kirituvchisi bu maydon yoki mulkka tayinlanish (§ 7.17.1) bilan bir xil tarzda ishlanadi.

     

tenglik belgisi keyin ob'ekt boshlang'ichini belgilaydigan a'zolar boshlang'ichi ichki o'rnatilgan ob'ekt boshlang'ichi, ya'ni katıştırılmış ob'ektni ishga tushirilishi. Maydondagi yoki mulkga yangi qiymat tayinlash o'rniga, ichki o'tgan ob'ekt boshlang'ichidagi topshiriqlar maydon yoki mulk a'zolariga tayinlash sifatida ko'rib chiqiladi. Nested ob'ekt boshlang'ichlari qiymat turiga ega xususiyatlarga yoki qiymat turi bilan faqat o'qish uchun ishlatilishi mumkin emas.

Sizning Value initializer inizatsiya qilingan boshlang'ich bo'lsa, Value sozlamasi ishga tushirilganda, uni faqat Value a'zolarini belgilashga ruxsat berishga imkon beradi. Albatta, allaqachon. Derleyici, Value null yoki yo'qligini tekshirish uchun hech qanday usuli yo'q, shuning uchun sizga xato bera olmaydi.

2
qo'shib qo'ydi

Ob'ektni ishga tushirishning sintaksisi ob'ektni avval yaratmasdan ishga tushirishga imkon beradi. Ob'ekt identifikatorini saqlamoqchi bo'lsangiz, bu juda muhimdir.

Misol uchun, ClassA.Value faqat o'qish uchun xususiyatni yaratishingiz mumkin va uni ob'ekt quruvchisi sifatida ishga tushirishingiz mumkin:

public class ClassA 
{
  public ClassA() 
  {
    Value = new MyDecimal();
  }

  public MyDecimal Value { get; private set; }
}

Ushbu xatti-harakatlar, albatta, C# spetsifikatsiyasida aniq ko'rsatilgan (5-versiyadan olingan paragraf):

7.6.10.2 ob'ekt boshlang'ichlari

     

Teng belgisidan keyin ifodani bildiradigan element kirituvchisi bu maydon yoki mulkka tayinlanish (§ 7.17.1) bilan bir xil tarzda ishlanadi.

     

tenglik belgisi keyin ob'ekt boshlang'ichini belgilaydigan a'zolar boshlang'ichi ichki o'rnatilgan ob'ekt boshlang'ichi, ya'ni katıştırılmış ob'ektni ishga tushirilishi. Maydondagi yoki mulkga yangi qiymat tayinlash o'rniga, ichki o'tgan ob'ekt boshlang'ichidagi topshiriqlar maydon yoki mulk a'zolariga tayinlash sifatida ko'rib chiqiladi. Nested ob'ekt boshlang'ichlari qiymat turiga ega xususiyatlarga yoki qiymat turi bilan faqat o'qish uchun ishlatilishi mumkin emas.

Sizning Value initializer inizatsiya qilingan boshlang'ich bo'lsa, Value sozlamasi ishga tushirilganda, uni faqat Value a'zolarini belgilashga ruxsat berishga imkon beradi. Albatta, allaqachon. Derleyici, Value null yoki yo'qligini tekshirish uchun hech qanday usuli yo'q, shuning uchun sizga xato bera olmaydi.

2
qo'shib qo'ydi