C # හි ප්‍රශ්න ලකුණු දෙකක් එකට අදහස් කරන්නේ කුමක්ද?


1650

මෙම කේත රේඛාව හරහා දිව යන්න:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

ප්‍රශ්න ලකුණු දෙකෙන් අදහස් කරන්නේ කුමක්ද, එය යම් ආකාරයක ත්‍රික ක්‍රියාකරුවෙකුද? ගූගල් හි සොයා බැලීම දුෂ්කර ය.


51
එය නියත ය නොවන වන මිශ්ර ක්රියාකරු - එය පමණක් operands දෙකක් ඇත! එය ටිකක් මේ කොන්දේසි ක්රියාකරු (එය වගේ වේ මිශ්ර) නමුත් ක්රියාකරු එක් රැස්වෙමින් ඇති ශූන්ය ද්විමය ක්රියාකරු වේ.
ජෝන් ස්කීට්

91
මා එය සම්මුඛ සාකච්ඡාවකදී පැහැදිලි කළේ අනාගත සේවා යෝජකයා මීට පෙර මගේ C # හැකියාවන් පිළිබඳව සැක පහළ කර ඇති හෙයිනි, මම මීට ටික කලකට පෙර ජාවා වෘත්තීමය වශයෙන් භාවිතා කර ඇති බැවින්. ඔවුන් මීට පෙර ඒ ගැන අසා නැති අතර, සී # සමඟ මගේ හුරුපුරුදුකම ගැන ප්‍රශ්න නොකළේය :)
ජෝන් ස්කීට්

78
On ජෝන් ස්කීට් බීට්ල්ස් ප්‍රතික්ෂේප කළ පුද්ගලයාගෙන් එබඳු වීර කාව්‍යයක් කුසලතා හඳුනා ගැනීමට අපොහොසත් වී නැත. :-) මෙතැන් සිට ඇතුළත කවරයේ ලියා ඇති ඔබේ SO පැතිකඩට url සබැඳියක් සහිත ඔබේ පොතේ පිටපතක් ඔවුන්ට එවන්න.
ඉයන් හෝල්ඩර්

6
IainMH: දේ එය වටිනා, මම තිබුණේ නැත තරමක් තවමත් පොතේ ලියන ආරම්භ විය. (එහෙම නැත්නම් මම 1 පරිච්ඡේදය මත වැඩ කරමින් සිටි -. ඒ වගේ දෙයක්) පිළිගත මට සෝදිසි ඉක්මනින් මගේ බ්ලොග් + ලිපි ආදිය සොයා ඇත
ජෝන් Skeet

7
Re: q හි අවසාන වාක්‍යය - අනාගත ref සඳහා, SymbolHound මේ ආකාරයේ දේ සඳහා විශිෂ්ටයි. උදා: symbolhound.com/?q=%3F%3F&l=&e=&n=&u= [සැක සහිත ඕනෑම කෙනෙකුට - මම සම්බන්ධ නොවෙමි ඕනෑම ආකාරයකින්, මම එකක් සොයාගත් විට හොඳ මෙවලමක් මෙන් ...]
ස්ටීව් චේම්බර්ස්

Answers:


2184

එය ශුන්‍ය සිසිලන ක්‍රියාකරු වන අතර එය ත්‍රික (ක්ෂණික නම්) ක්‍රියාකරුට සමානය. මෙයද බලන්න ?? ක්රියාකරු - MSDN .

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

දක්වා පුළුල් වේ:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

එය තවදුරටත් පුළුල් වන්නේ:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

ඉංග්‍රීසියෙන් එහි තේරුම "වමට ඇති සියල්ල ශුන්‍ය නොවේ නම්, එය භාවිතා කරන්න, එසේ නොමැතිනම් දකුණට ඇති දේ භාවිතා කරන්න."

ඔබට මේවායින් ඕනෑම සංඛ්‍යාවක් අනුපිළිවෙලින් භාවිතා කළ හැකි බව සලකන්න. පහත දැක්වෙන ප්රකාශය පළමු නොවන ශූන්ය පවරනු ඇත Answer#කිරීමට Answer(සියළුම පිළිතුරු ශූන්ය වේ නම්, එවිට එම Answerශූන්ය වේ):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

ඉහත ප්‍රසාරණය සංකල්පමය වශයෙන් සමාන වන අතර, එක් එක් ප්‍රකාශනයේ ප්‍රති result ලය තක්සේරු කරනු ලබන්නේ එක් වරක් පමණි. නිදසුනක් ලෙස ප්‍රකාශනයක් යනු අතුරු ආබාධ සහිත ක්‍රම ඇමතුමක් නම් මෙය වැදගත් වේ. (මෙය පෙන්වා දීම සඳහා @ ජෝයිට ණය.)


17
මේවා දම්වැල් දැමීම අනතුරුදායක විය හැකිය
කෝප්ස්

6
Ode කෝඩ් බ්ලෙන්ඩ් කරන්නේ කෙසේද?
එල්සී.

70
Ode කෝඩ් බ්ලෙන්ඩ්, එය භයානක නොවේ. ඔබ පුළුල් කරන්නේ නම් ඔබට කැදැලි නම් / වෙනත් ප්‍රකාශ මාලාවක් තිබේ. ඔබ එය දැකීමට පුරුදු නැති නිසා වාක්‍ය ඛණ්ඩය අමුතුයි.
joelmdev

31
එය හිස් නූල් සඳහාද වැඩ කළේ නම් එය දෙවියන්වහන්සේගේ පණිවිඩයක් වනු ඇත :)
සයිෆ්‍රැක්ස්

14
Us ගුස්ඩෝර් ??වම් සහායකයා වන අතර a ?? b ?? c ?? dඑය සමාන වේ ((a ?? b) ?? c ) ?? d. "පැවරුම් ක්‍රියාකරුවන් සහ ත්‍රිමාණ ක්‍රියාකරු (? :) නිවැරදි සහායකය. අනෙක් සියලුම ද්විමය ක්‍රියාකරුවන් වම් සහායක වේ." මුලාශ්‍රය: msdn.microsoft.com/en-us/library/ms173145.aspx
මාර්ක් ඊ. හේස්

287

වෙනත් කිසිවෙකු තවමත් මැජික් වචන පවසා නැති නිසා: එය ශුන්‍ය සිසිලන ක්‍රියාකරු ය . එය C # 3.0 භාෂා පිරිවිතරයේ 7.12 වගන්තියේ අර්ථ දක්වා ඇත .

එය ඉතා පහසුය, විශේෂයෙන් එය ප්‍රකාශනයක කිහිප වතාවක් භාවිතා කරන විට එය ක්‍රියා කරන ආකාරය නිසාය. පෝරමයේ ප්‍රකාශනයක්:

a ?? b ?? c ?? d

ප්‍රකාශනයේ aප්‍රති result ලය එය ශුන්‍ය නොවේ නම් ලබා දෙනු ඇත, එසේ නොමැතිනම් උත්සාහ කරන්න b, එසේ නොමැතිනම් උත්සාහ කරන්න c, නැතිනම් උත්සාහ කරන්න d. එය සෑම අවස්ථාවකම කෙටි පරිපථ.

එසේම, වර්ගය dඅහෝසි කළ නොහැකි නම්, සමස්ත ප්‍රකාශනයේ වර්ගය ද අහෝසි කළ නොහැකි ය.


2
මම කැමතියි ඔබ එහි අර්ථය “ශුන්‍ය සිසිලන ක්‍රියාකරු” ලෙස සරල කළ ආකාරය. මට අවශ්‍ය වූයේ එයයි.
ෆ්‍රැන්කෝ

2
දේවල් ස්පර්ශ නමුත් අදාළ: එය ස්විෆ්ට් දැන්, නමුත් එය ඉතා වෙනස් වේ: "නිල් එක් රැස්වෙමින් ක්රියාකරු" developer.apple.com/library/ios/documentation/Swift/Conceptual/...
දාන් Rosenstark

71

එය ශුන්‍ය සිසිලන ක්‍රියාකරු ය.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

ඔව්, එය හැඳින්වූයේ කුමක්දැයි ඔබ නොදන්නේ නම් සෙවීමට නොහැකි තරම්ය! :-)

සංස්කරණය කරන්න: මෙය වෙනත් ප්‍රශ්නයකින් ලැබෙන සිසිල් ලක්ෂණයකි. ඔබට ඒවා දම්වැල් කළ හැකිය.

සී # හි සැඟවුණු විශේෂාංග?


35
අවම වශයෙන් දැන්, එය සෙවීම පහසුය, ඔබ නම නොදැන සිටියද, මම "ද්විත්ව ප්‍රශ්නාර්ථ ලකුණ # #"
stivlo

27

සැමට ස්තූතියි, එම්එස්ඩීඑන් වෙබ් අඩවියෙන් මා සොයාගත් වඩාත් සංක්ෂිප්ත පැහැදිලි කිරීම මෙන්න:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

4
මෙය වැදගත් අංගයක් ගැන ඉඟි කරයි ?? ක්‍රියාකරු - එය හඳුන්වා දෙනු ලැබුවේ අහෝසි කළ හැකි වර්ග සමඟ වැඩ කිරීමට සහාය වීම සඳහා ය. ඔබේ උදාහරණයේ දී, "x" වර්ගය "int?" (අහෝසි කළ හැකි <int>).
ඩ්‍රූ නොක්ස්

9
@vitule no, ශුන්‍ය සිසිලන ක්‍රියාකරුගේ දෙවන ක්‍රියාකාරීත්වය අහෝසි කළ නොහැකි නම්, ප්‍රති result ලය අහෝසි කළ නොහැකි ය ( -1එය නිකම්ම නිකම් int, එය ශුන්‍ය නොවන).
සුසෑන් ඩුපෙරොන්

මම හිතනවා ඒක මේ වගේ වැඩ කරයි කියලා. මට මෙය සැමවිටම කිරීමට අවශ්‍යයි, නමුත් මට නොහැකි වන්නේ මා භාවිතා කරන විචල්‍යය අහෝසි කළ හැකි වර්ගයක් නොවන බැවිනි. කෝපි පිටපතෙහි ක්‍රියා කරයි y = x? -1
පැන්ඩාවුඩ්

Anda පැන්ඩාවුඩ් ඇත්තටම ඔබට පුළුවන්. නම් xආකාරයේ වන int?, නමුත් yආකාරයේ වන int, ඔබ ලිවීමට හැකි int y = (int)(x ?? -1). එය විග්රහ කළ ඇත xෙවත intඑය එසේ නොවේ නම්, nullහෝ පැවරීම -1සඳහා yනම් xවේ null.
ජොහාන් වින්ට්ජන්ස්

21

??අගය ශුන්‍ය වන විට අහෝසි කළ හැකි වර්ගයක් සඳහා අගයක් සැපයීමට තිබේ. එබැවින්, FormAuth ශුන්‍ය නම්, එය නව FormsAuthenticationWrapper () නැවත ලබා දෙනු ඇත.


20

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ප්‍රශ්න ලකුණු දෙකෙන් (??) පෙන්නුම් කරන්නේ එහි සමතුලිත ක්‍රියාකරු බවයි.

සංගුණක ක්‍රියාකරු දාමයකින් පළමු NON-NULL අගය ලබා දෙයි. සමස්තයක්ම ප්‍රායෝගිකව නිරූපණය කරන මෙම යූ ටියුබ් වීඩියෝව ඔබට දැක ගත හැකිය .

නමුත් වීඩියෝව පවසන දෙයට තවත් එකතු කිරීමට මට ඉඩ දෙන්න.

ඒකාබද්ධ වීමේ ඉංග්‍රීසි තේරුම ඔබ දුටුවහොත් එය පවසන්නේ “එකට ඒකාබද්ධ වන්න” යන්නයි. උදාහරණයක් ලෙස පහත දැක්වෙන්නේ නූල් හතරක් දම්වැලකින් යුත් සරල සිසිලන කේතයකි.

එසේ නම් str1වේ nullඑය උත්සාහ කරනු ඇත str2නම්, str2වේ nullඑය උත්සාහ කරනු ඇත str3සහ ඒ නිසා එය-ශූන්ය නොවන වටිනාකමක් සහිත වැලක් සම්බ වන තුරු මත.

string final = str1 ?? str2 ?? str3 ?? str4;

සරල වචන වලින් කිවහොත්, දඟර ක්‍රියාකරු පළමු NON-NULL අගය දාමයකින් ලබා දෙයි.


1
මම මෙම පැහැදිලි කිරීමට කැමතියි එයට රූප සටහනක් ඇති නිසා, පසුව අවසාන වාක්‍යය එතරම් සරල වචන වලින් එය පැහැදිලි කරයි! එය තේරුම් ගැනීම පහසු කරවන අතර භාවිතය පිළිබඳ මගේ විශ්වාසය වැඩි කරයි. ස්තූතියි!
ජෝෂුවා කේ

14

එය ත්‍රිමාණ ක්‍රියාකරුට කෙටි අතකි.

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

හෝ ත්‍රිකෝණය නොකරන අයට:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}

3
මම නිවැරදි කර ඇත්තේ "තෘතීය" අක්ෂර වින්‍යාසය පමණි, නමුත් ඇත්ත වශයෙන්ම ඔබ අදහස් කරන්නේ ක්‍රියාකරු කොන්දේසි සහිත ක්‍රියාකරු ය. එය C # හි ඇති එකම ත්‍රික ක්‍රියාකරු වේ, නමුත් යම් අවස්ථාවක දී ඔවුන් තවත් එකක් එකතු කළ හැකිය, එම අවස්ථාවේදී “ත්‍රිකෝණය” නොපැහැදිලි නමුත් “කොන්දේසි සහිත” නොවේ.
ජෝන් ස්කීට්

එය ඔබ හැකි දෙයක් අයුරෙන් තියෙන්නේ කරන්න ඇති මිශ්ර (කොන්දේසි සහිතව) ක්රියාකරු සමග. ඔබගේ දිගු ස්වරූපයෙන්, පරීක්ෂණය ( != null) සහ දෙවන formsAuth(පසු ) යන දෙකම ?වෙනස් කළ හැකිය; ශුන්‍ය සංයුක්ත ස්වරූපයෙන්, දෙකම ඔබ සපයා ඇති අගයන් ව්‍යංගයෙන් ගනී.
බොබ් සමර්ස්

12

ඔබ රූබි සමඟ හුරුපුරුදු නම්, එය මට ||=C # ට සමාන බව පෙනේ ??. මෙන්න රූබි කිහිපයක්:

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

සහ සී # හි:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

4
x ||= yවගේ දෙයක් කිරීමට desugars x = x || yනිසා, ??ඇත්තටම සරල වඩා සමාන වේ ||රූබි දී.
qerub

6
සටහන බව ??ගැන සැළකිලිමත් වන එකම null, එනමුදු ||රූබි දී ක්රියාකරු, බොහෝ භාෂා දී මෙන්, පිළිබඳ වැඩි වේ null, falseහෝ එහි වටිනාකම සමඟ වීජ සලකා බැලිය හැකි ඕනෑම දෙයක් false(සමහර භාෂා උදා, ""). මෙය හොඳ හෝ නරක දෙයක් නොවේ, හුදෙක් වෙනසක්.
ටිම් එස්

11

සමතුලිත ක්‍රියාකරු

එය සමාන වේ

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth

11

මේ ගැන භයානක කිසිවක් නැත. ඇත්ත වශයෙන්ම, එය ලස්සනයි. එය සුදුසු නම් ඔබට පෙරනිමි අගය එකතු කළ හැකිය, උදාහරණයක් ලෙස:

කේතය

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

1
එබැවින් x1, x2, x3 සහ x4 ශුන්‍ය වර්ග විය හැකිය, උදාහරණයක්: int? x1 = null;එය නිවැරදිද
කෙවින් මෙරඩිත්

1
E කෙවින්මෙරිඩිත් x1- අහෝසි x4කළ හැකි වර්ග විය යුතුය: " effectively ලදායී ලෙස," ප්‍රති result ලය වන්නේ එය ගත නොහැකි අගයක් 0නම් x4"( null). මෙහි “අහෝසි කළ හැකි වර්ගයට” ඇතුළත් කළ හැකි අගයන් වර්ග සහ යොමු වර්ග දෙකම ඇතුළත් වේ . දම්වැල් සහිත විචල්‍යයන්ගෙන් එකක් හෝ වැඩි ගණනක් (අන්තිම එක හැර) අහෝසි කළ නොහැකි නම් එය සම්පාදක කාල දෝෂයකි.
බොබ් සමර්ස්

11

බොහෝ පිළිතුරු වලින් නිවැරදිව පෙන්වා ඇති පරිදි, “ශුන්‍ය සිසිලන ක්‍රියාකරු” ( ?? ), ඒ ගැන කතා කිරීමෙන් ඔබට එහි ous ාති සහෝදරයා වන “ශුන්‍ය-කොන්දේසි සහිත ක්‍රියාකරු” ( ? හෝ ? [ ) පරීක්ෂා කර බැලීමට අවශ්‍ය වනු ඇත . බොහෝ විට එය සමඟ ඒකාබද්ධව භාවිතා වේ ??

ශුන්‍ය-කොන්දේසි සහිත ක්‍රියාකරු

සාමාජික ප්‍රවේශයක් ( ?. ) හෝ දර්ශක ( ? [ ) මෙහෙයුමක් කිරීමට පෙර ශුන්‍යය සඳහා පරීක්ෂා කිරීමට භාවිතා කරයි . ශුන්‍ය චෙක්පත් හැසිරවීමට අඩු කේතයක් ලිවීමට මෙම ක්‍රියාකරුවන් ඔබට උදව් කරයි, විශේෂයෙන් දත්ත ව්‍යුහයන්ට බැසීමට.

උදාහරණයක් වශයෙන්:

// if 'customers' or 'Order' property or 'Price' property  is null,
// dollarAmount will be 0 
// otherwise dollarAmount will be equal to 'customers.Order.Price'

int dollarAmount = customers?.Order?.Price ?? 0; 

නැතිව පැරණි ක්‍රමය ?. සහ ?? මෙය කිරීම

int dollarAmount = customers != null 
                   && customers.Order!=null
                   && customers.Order.Price!=null 
                    ? customers.Order.Price : 0; 

එය වඩාත් වාචික හා කරදරකාරී ය.


10

ඔබගේ විනෝදය සඳහා පමණි (ඔබ සියල්ලන්ම C # යාලුවනේ බව දැන ගැනීම ;-).

මම හිතන්නේ එය ආරම්භ වූයේ ස්මාල්ටෝක්හි, එය වසර ගණනාවක් තිස්සේ පැවතුනි. එය එහි අර්ථ දැක්වෙන්නේ:

වස්තුව තුළ:

? anArgument
    ^ self

නිර්වචනය නොකළ වස්තුවෙහි (නිල් පන්තියේ):

? anArgument
    ^ anArgument

මෙහි ඇගයීම් (?) සහ ඇගයීමට ලක් නොකරන අනුවාද (??) යන දෙකම ඇත.
එය බොහෝ විට කම්මැලි-ආරම්භක පුද්ගලික (නිදර්ශන) විචල්‍යයන් සඳහා වන ක්‍රමවේදයන් තුළ දක්නට ලැබේ, ඒවා සැබවින්ම අවශ්‍ය වන තෙක් ඉතිරි නොවේ.


පරිශීලක පාලකයක ඇති දේපලක් සමඟ ViewState ඔතා ඇති බවක් පෙනේ. එය කලින් සකසා නොමැති නම්, පළමු ලබා ගැනීමේදී පමණක් ආරම්භ කරන්න. =)
සයිටි

9

සමතුලිතතාවය භාවිතා කරමින් අගයන් ලබා ගැනීම සඳහා මෙහි උදාහරණ සමහරක් අකාර්යක්ෂම වේ.

ඔබට සැබවින්ම අවශ්‍ය වන්නේ:

return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();

හෝ

return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());

මෙමඟින් වස්තුව සෑම විටම ප්‍රතිනිර්මාණය වීම වළක්වයි. පුද්ගලික ඉල්ලුමේ ඉතිරිව ඇති ශුන්‍යය සහ සෑම ඉල්ලීමකටම නව වස්තුවක් නිර්මාණය කිරීම වෙනුවට, නව වස්තුව නිර්මාණය කළ හොත් පුද්ගලික විචල්‍යය පැවරීම සහතික කරයි.


කෙටිමං ??තක්සේරු කර නැද්ද? new FormsAuthenticationWrapper();තක්සේරු කරනු ලබන්නේ නිල් නම් පමණි _formsAuthWrapper .
MSalters

ඔව් ඒක තමයි මුළු කාරණය. ඔබට අවශ්‍ය වන්නේ විචල්‍යය ශුන්‍ය නම් පමණි. @ MSalters
KingOfHypocrites

8

සටහන:

මම මේ ත්‍රෙඩ් එක සහ තවත් බොහෝ දේ කියවා ඇති නමුත් මට මේ තරම් ගැඹුරු පිළිතුරක් සොයාගත නොහැක.

"භාවිතා කරන්නේ ඇයි ?? සහ කවදා භාවිතා කළ යුතුද ?? සහ භාවිතා කරන්නේ කෙසේද ??"

මූලාශ්රය:

වින්ඩෝස් සන්නිවේදන පදනම මුදා හැරියේ ක්‍රේග් මැක්මර්ට්‍රි ISBN 0-672-32948-4

අවලංගු කළ හැකි අගය වර්ග

අගය වර්ගයක උදාහරණයකට අගයක් පවරා තිබේද යන්න දැන ගැනීමට කැමති පොදු අවස්ථා දෙකක් තිබේ. පළමුවැන්න දත්ත සමුදායක අගය නිරූපණය කරන විට ය. එවැනි අවස්ථාවක, දත්ත සමුදායේ වටිනාකමක් ඇත්ත වශයෙන්ම තිබේදැයි සොයා බැලීමට උදාහරණය පරීක්ෂා කිරීමට කෙනෙකුට අවශ්‍ය වේ. මෙම පොතේ විෂය කරුණු වලට වඩා අදාළ වන අනෙක් අවස්ථාව නම්, යම් දුරස්ථ ප්‍රභවයකින් ලැබෙන දත්ත අයිතමයක් උදාහරණය නිරූපණය කරන විට ය. නැවතත්, යමෙක් එම දත්ත අයිතමයට වටිනාකමක් ලැබුනේ දැයි නිශ්චය කිරීමට කැමති ය.

.NET Framework 2.0 හි සාමාන්‍ය වර්ගයේ අර්ථ දැක්වීමක් ඇතුළත් වන අතර එමඟින් වටිනාකම් වර්ගයක උදාහරණයකට ශුන්‍යය පැවරීමට අවශ්‍ය වන අවස්ථාවන් සඳහා සපයන අතර උදාහරණයේ වටිනාකම ශුන්‍ය දැයි පරීක්ෂා කරන්න. එම සාමාන්‍ය වර්ගයේ අර්ථ දැක්වීම System.Nullable වේ, එය T සඳහා අගය වර්ග සඳහා ආදේශ කළ හැකි සාමාන්‍ය වර්ගයේ තර්ක සීමා කරයි. System.Nullable වෙතින් සාදන ලද වර්ගවල අවස්ථා ශුන්‍ය අගයක් ලබා දිය හැකිය; ඇත්ත වශයෙන්ම, ඒවායේ අගයන් පෙරනිමියෙන් අහෝසි වේ. මේ අනුව, System.Nullable වෙතින් සාදන ලද වර්ග ශුන්‍ය වටිනාකම් වර්ග ලෙස හැඳින්විය හැක. System.Nullable හි දේපලක් ඇත, අගය, එමඟින් සාදන ලද වර්ගයක උදාහරණයකට පවරා ඇති අගය, එම අවස්ථාවෙහි අගය ශුන්‍ය නොවේ නම් ලබා ගත හැකිය. එබැවින් කෙනෙකුට ලිවිය හැකිය:

System.Nullable<int> myNullableInteger = null;
myNullableInteger = 1;
if (myNullableInteger != null)
{
Console.WriteLine(myNullableInteger.Value);
}

C # ක්‍රමලේඛන භාෂාව System.Nullable වෙතින් සාදන ලද වර්ග ප්‍රකාශ කිරීම සඳහා සංක්ෂිප්ත වාක්‍ය ඛණ්ඩයක් සපයයි. එම වාක්‍ය ඛණ්ඩය කෙටි කිරීමට කෙනෙකුට ඉඩ දෙයි:

System.Nullable<int> myNullableInteger;

වෙත

int? myNullableInteger;

සම්පාදකයා විසින් මේ ආකාරයෙන් අහෝසි කළ හැකි අගය වර්ගයක අගය සාමාන්‍ය අගය වර්ගයකට පැවරීමට උත්සාහ කිරීම වළක්වනු ඇත:

int? myNullableInteger = null;
int myInteger = myNullableInteger;

එය එසේ කිරීමෙන් වලක්වනුයේ ශුන්‍ය අගය වර්ගයට ශුන්‍ය අගයක් තිබිය හැකි නිසා එය ඇත්ත වශයෙන්ම මෙම අවස්ථාවේ දී තිබිය හැකි අතර එම අගය සාමාන්‍ය අගය වර්ගයකට පැවරිය නොහැකි බැවිනි. සම්පාදකයා මෙම කේතයට අවසර දුන්නද,

int? myNullableInteger = null;
int myInteger = myNullableInteger.Value;

System.Nullable.Value දේපල වෙත පිවිසීමට ගන්නා ඕනෑම උත්සාහයක් අවලංගු ක්‍රියාවක් වන බැවින් දෙවන ප්‍රකාශය ව්‍යතිරේකයක් විසි කිරීමට හේතු වේ. System.Nullable ට T හි වලංගු අගයක් පවරා නොමැති අතර එය සිදු වී නොමැත නඩුව.

නිගමනය:

ශුන්‍ය අගය වර්ගයක අගය සාමාන්‍ය අගය වර්ගයකට පැවරීම සඳහා එක් සුදුසු ක්‍රමයක් නම්, T හි වලංගු අගයක් ශුන්‍ය අගය වර්ගයට පවරා තිබේද යන්න සොයා බැලීම සඳහා System.Nullable.HasValue දේපල භාවිතා කිරීමයි:

int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}

තවත් විකල්පයක් වන්නේ මෙම වාක්‍ය ඛණ්ඩය භාවිතා කිරීමයි:

int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;

සාමාන්‍ය නිඛිල සංඛ්‍යාවක් වන myInteger හට වලංගු පූර්ණ සංඛ්‍යාවක් ලබා දී ඇත්නම්, “myNullableInteger” නම් කළ නොහැකි පූර්ණ සංඛ්‍යා වල අගය පවරනු ලැබේ; එසේ නොමැතිනම්, myInteger ට -1 හි අගය පවරනු ලැබේ.


1

එය ත්‍රිමාණ ක්‍රියාකරුට සමානව ක්‍රියා කරන ශුන්‍ය සිසිලන ක්‍රියාකරුවෙකි.

    a ?? b  => a !=null ? a : b 

මේ සඳහා තවත් සිත්ගන්නා කරුණක් නම්, “අහෝසි කළ හැකි වර්ගයක වටිනාකමක් තිබිය හැකිය, නැතහොත් එය නිර්වචනය කළ නොහැක” . එබැවින් ඔබ ශුන්‍ය නොවන අගය වර්ගයක් නොබැඳිය හැකි අගය වර්ගයකට පැවරීමට උත්සාහ කළහොත් ඔබට සම්පාදක කාල දෝෂයක් ලැබෙනු ඇත.

int? x = null; // x is nullable value type
int z = 0; // z is non-nullable value type
z = x; // compile error will be there.

ඉතින් ඒක පාවිච්චි කරන්න ?? ක්රියාකරු:

z = x ?? 1; // with ?? operator there are no issues

1
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

සමාන වේ

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

නමුත් එහි ඇති සිසිල්ම දෙය නම් අනෙක් අය කීවාක් මෙන් ඔබට ඒවා දම්වැල දැමිය හැකිය. සිහින් ස්පර්ශ නොකළ එකක් නම්, ව්‍යතිරේකයක් විසි කිරීමට ඔබට එය සැබවින්ම භාවිතා කළ හැකිය.

A = A ?? B ?? throw new Exception("A and B are both NULL");

ක්‍රියාකරු යනු කුමක්ද සහ කරන්නේ කුමක්ද යන්න පිළිබඳ ප්‍රශ්නයක් පැහැදිලි කිරීමක් සොයමින් සිටියද, ඔබ ඔබේ ලිපියට උදාහරණ ඇතුළත් කිරීම ඇත්තෙන්ම සතුටක්.
TGP1994

1

මෙම ??ක්රියාකරු ශූන්ය-එක් රැස්වෙමින් ක්රියාකරු ලෙස හැඳින්වේ. ඔපෙරන්ඩ් ශුන්‍ය නොවේ නම් එය වම් අත ඔපෙරන්ඩ් යවයි; එසේ නොමැතිනම් එය දකුණු අත ක්‍රියාත්මක කරයි.

int? variable1 = null;
int variable2  = variable1 ?? 100;

ශුන්‍ය නොවේ නම් variable2එහි අගයට සකසන්න ; එසේ නොමැති නම් , 100 ට සකසන්න .variable1variable1variable1 == nullvariable2


0

තවත් සමහරු Null Coalescing Operatorඑය හොඳින් විස්තර කර ඇත. උනන්දුවක් දක්වන අය සඳහා, මෙය කෙටි කරන ලද වාක්‍ය ඛණ්ඩයක් ඇත (SO ප්‍රශ්නය):

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

මෙයට සමාන වේ:

FormsAuth ??= new FormsAuthenticationWrapper();

සමහරු එය වඩාත් කියවිය හැකි සහ සාරාංශගත කරති.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.