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


1474

මෙම ප්‍රශ්නයෙන් මම පහත කරුණු ඉගෙන ගත් පසු මෙය මගේ මතකයට නැඟුණි :

where T : struct

අපි, සී # සංවර්ධකයින්, සියල්ලන්ම සී # හි මූලික කරුණු දනිමු. මම අදහස් කළේ ප්‍රකාශන, කොන්දේසි, ලූප, ක්‍රියාකරුවන් යනාදියයි.

අපෙන් සමහරෙක් ජෙනරික්ස් , නිර්නාමික වර්ග , ලැම්බඩාස් , ලින්ක් , ...

C # පංකා, ඇබ්බැහි වූවන්, විශේෂ experts යන් පවා නොදන්නා C # හි වඩාත්ම සැඟවුණු අංග හෝ උපක්‍රම මොනවාද?

මෙතෙක් අනාවරණය වූ ලක්ෂණ මෙන්න:


මූල පද

ගුණාංග

සින්ටැක්ස්

භාෂා විශේෂාංග

දෘශ්‍ය ස්ටුඩියෝ විශේෂාංග

රාමුව

ක්‍රම සහ ගුණාංග

ඉඟි සහ උපක්‍රම

වෙනත්

Answers:


751

මෙය C # per se නොවේ, නමුත් System.IO.Path.Combine()ඔවුන් කළ යුතු ප්‍රමාණයට සැබවින්ම භාවිතා කරන කිසිවෙකු මා දැක නැත . ඇත්ත වශයෙන්ම, මුළු පාත් පන්තිය සැබවින්ම ප්රයෝජනවත් වේ, නමුත් කිසිවෙකු එය භාවිතා නොකරයි!

සෑම නිෂ්පාදන යෙදුමකටම පහත කේතය ඇති බව මම ඔට්ටු ඇල්ලීමට කැමැත්තෙමි.

string path = dir + "\\" + fileName;

583

lambdas සහ type inference අවතක්සේරු කර ඇත. ලැම්බඩාස්ට විවිධ ප්‍රකාශ තිබිය හැකි අතර ඒවා ස්වයංක්‍රීයව අනුකූල නියෝජිත වස්තුවක් මෙන් දෙගුණයක් වේ (අත්සන ගැලපෙන බවට වග බලා ගන්න):

Console.CancelKeyPress +=
    (sender, e) => {
        Console.WriteLine("CTRL+C detected!\n");
        e.Cancel = true;
    };

මා සතුව නැති බවත්, new CancellationEventHandlerමා හට වර්ග නියම කළ යුතු නැති senderබවත් e, ඒවා සිදුවීමෙන් නුසුදුසු බවත් සලකන්න. සමස්තයක් ලිවීමට මෙය අඩු කරදරකාරී වන්නේ එබැවිනි. delegate (blah blah)එමඟින් ඔබට පරාමිති වර්ග නියම කිරීමට අවශ්‍ය වේ.

ලැම්බඩාස්ට කිසිවක් ආපසු ලබා දීමට අවශ්‍ය නොවන අතර මේ ආකාරයේ සන්දර්භය තුළ අනුමාන කිරීම අතිශයින්ම බලවත්ය.

සහ BTW, ඔබට සෑම විටම ක්‍රියාකාරී ක්‍රමලේඛන අර්ථයෙන් ලැම්බඩාස් සාදන ලැම්බඩාස් ආපසු ලබා දිය හැකිය . උදාහරණයක් ලෙස, බොත්තමක් හසුරුවන ලැම්බඩා සාදන ලැම්බඩා මෙන්න. ක්ලික් කරන්න සිද්ධිය:

Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };

btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);

දම්වැල සටහන් කරන්න: (dx, dy) => (sender, e) =>

ක්‍රියාකාරී ක්‍රමලේඛන පන්තිය ගැනීමට ලැබීම ගැන දැන් මම සතුටු වෙමි :-)

සී හි දර්ශකයන් හැරුණු විට, ඔබ ඉගෙන ගත යුතු අනෙක් මූලික දෙය එය යැයි මම සිතමි :-)


527

රික් ස්ට්‍රාල් වෙතින් :

ඔබට දම්වැල දැමිය හැකිද ?? ක්‍රියාකරු එවිට ඔබට ශුන්‍ය සැසඳීම් රාශියක් කළ හැකිය.

string result = value1 ?? value2 ?? value3 ?? String.Empty;

453

අන්වර්ථ ජනක:

using ASimpleName = Dictionary<string, Dictionary<string, List<string>>>;

එය ASimpleNameවෙනුවට භාවිතා කිරීමට ඔබට ඉඩ සලසයිDictionary<string, Dictionary<string, List<string>>> .

ඔබ එකම සාමාන්‍ය විශාල දිගු සංකීර්ණ දේ බොහෝ ස්ථානවල භාවිතා කරන විට එය භාවිතා කරන්න.


437

සිට CLR C # හරහා :

නූල් සාමාන්‍යකරණය කිරීමේදී, ටොලර්වර් ඉන්වරියන්ට් වෙනුවට ටූපර්ඉන්වරියන්ට් භාවිතා කිරීම රෙකමදාරු කරනු ලැබේ .

සැසඳීමට පෙර මගේ සහායකයා සෑම විටම ලොකු අකුරට නූල් වෙනස් කළ බව මට මතකයි. ඔහු නිතරම එසේ කරන්නේ ඇයිදැයි මම නිතරම කල්පනා කර ඇත්තෙමි. පොත කියවීමෙන් පසු දැන් මම දන්නවා ඒ ඇයි කියලා.


254
ඔබ "නූලක් ඉහළ අකුරක් බවට පරිවර්තනය කළ විට" ඔබ දෙවන තාවකාලික නූල් වස්තුවක් සාදයි. මේ ආකාරයේ සංසන්දනයකට වැඩි කැමැත්තක් නොදක්වන බව මම සිතුවෙමි, හොඳම ක්‍රමය නම්: String.Equals (stringA, stringB, StringComparison.CurrentCultureIgnoreCase) whchh විසින් මෙම ඉවතලන නූල් කිසිසේත් නිර්මාණය නොකරයි.
ඇන්තනි

32
කුඩා අකුරු මත කළ නොහැකි ඉහළ අකුරු නූල් සංසන්දනය කිරීමේදී ඔබට කුමන ආකාරයේ ප්‍රශස්තිකරණයක් කළ හැකිද? එකක් අනෙකට වඩා ප්‍රශස්ත වන්නේ මන්දැයි මට තේරෙන්නේ නැත.
පරප්පා

36
සිම්පල් වලට වඩා ලොකු අකුරක් බවට පරිවර්තනය කිරීමෙන් ඇතැම් සංස්කෘතීන්හි වැරදි හැසිරීම වළක්වා ගත හැකිය. නිදසුනක් ලෙස, තුර්කි බසින්, කුඩා අකුරු දෙකක් එකම ලොකු අකුරට I සිතියම I. ගූගල් වැඩි විස්තර සඳහා "තුර්කි අයි".
නීල්

34
ToUpperInvariant එදිරිව ToLowerInvariant සමඟ මිණුම් සලකුණු කිරීමට මම උත්සාහ කළෙමි. .NET 2.0 හෝ 3.5 යටතේ ඔවුන්ගේ ක්‍රියාකාරිත්වයේ කිසිදු වෙනසක් මට සොයාගත නොහැක. එකකට වඩා එකක් ඉහළින් භාවිතා කිරීම "අතිශයින් නිර්දේශ කිරීම" අවශ්‍ය කිසිවක් නොවේ.
රස්මුස් ෆේබර්

19
ToUpperInvariant වඩාත් කැමති වන්නේ එය සියලු චරිත වට-චාරිකා කරන බැවිනි. Msdn.microsoft.com/en-us/library/bb386042.aspx බලන්න . සැසඳීම් සඳහා, ලියන්න"a".Equals("A", StringComparison.OrdinalIgnoreCase)
SLaks

407

මගේ ප්‍රියතම උපක්‍රමය නම් මා සඳහා එකතු කිරීම් ස්වයංක්‍රීයව ක්ෂණිකව ලබා දීම සඳහා ශුන්‍ය කොලෙස් ක්‍රියාකරු සහ වරහන් භාවිතා කිරීමයි .

private IList<Foo> _foo;

public IList<Foo> ListOfFoo 
    { get { return _foo ?? (_foo = new List<Foo>()); } }

23
ඔබට කියවීමට අපහසු නොවේද?
රිරි

72
අද්දැකීම් අඩු අය සඳහා එය කියවීමට තරමක් අපහසුය. නමුත් එහි සංයුක්ත වන අතර ක්‍රමලේඛකයා දැනගත යුතු හා තේරුම් ගත යුතු රටා සහ භාෂා අංග කිහිපයක් අඩංගු වේ. එබැවින්, මුලදී එය දුෂ්කර වුවත්, එය ඉගෙන ගැනීමට හේතුවක් වීමේ වාසිය ලබා දෙයි.

38
කම්මැලි ක්‍ෂණිකකරණය තරමක් අක්‍රමිකතාවයක් වන්නේ පන්ති ආක්‍රමණ ගැන සිතීමෙන් වැළකී සිටීම දුර්වල මිනිසෙකුගේ තේරීමක් වන බැවිනි. එයට සමගාමී මුදල් ගැටළු ද ඇත.
ජෝන් ලයිඩෙග්‍රන්

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

8
O ජොයෙල් හැර ListOfFoo අහෝසි කිරීම පන්ති කොන්ත්‍රාත්තුවේ කොටසක් නොවන අතර එය හොඳ පුරුද්දක් නොවේ. කට්ටලයක් නොමැති වන්නේ එබැවිනි. ListOfFoo විසින් එකතුවක් ආපසු ලබා දෙන බවට සහතික වී ඇති අතර එය කිසි විටෙකත් ශුන්‍ය නොවේ. එය ඉතා අමුතු පැමිණිල්ලකි, ඔබ නරක දේවල් දෙකක් කළහොත් (සැකසීමක් කර එකතුවක් අහෝසි කරන්න) මෙය ඔබගේ අපේක්ෂාවන් වැරදියි. Environment.Exit () ලබා ගැනීමට මම යෝජනා නොකරමි. නමුත් එයටද මෙම පිළිතුර සමඟ කිසිදු සම්බන්ධයක් නැත.

314

ශුන්‍ය සිදුවීම් හසුරුවන්නන් පරීක්ෂා කිරීමෙන් වළකින්න

ප්‍රකාශනයේ දී සිදුවීම් සඳහා හිස් නියෝජිතයෙකු එකතු කිරීම, එය ඇමතීමට පෙර සෑම විටම එය ශුන්‍ය ලෙස පරික්ෂා කිරීමේ අවශ්‍යතාවය යටපත් කරයි. උදාහරණයක්:

public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!

ඔබට මෙය කිරීමට ඉඩ දෙන්න

public void DoSomething()
{
    Click(this, "foo");
}

මේ වෙනුවට

public void DoSomething()
{
    // Unnecessary!
    MyClickHandler click = Click;
    if (click != null) // Unnecessary! 
    {
        click(this, "foo");
    }
}

මේ බලන්න කරුණාකර ආශ්රිත සාකච්ඡා සහ මෙම බ්ලොග් මෙම මාතෘකාව මත එරික් Lippert විසින් (සහ හැකි අර්ථයක්).


87
ඔබ මෙම තාක්‍ෂණය මත විශ්වාසය තැබුවහොත් ඔබට පංතිය අනුක්‍රමිකකරණය කළ යුතු නම් ගැටලුවක් මතු වනු ඇතැයි මම විශ්වාස කරමි. ඔබ සිදුවීම තුරන් කරනු ඇත, පසුව ආශිර්වාදකරණයෙන් ඔබට NullRefference එකක් ලැබෙනු ඇත .... එබැවින් යමෙකුට දේවල් කිරීමේ "පැරණි ක්‍රමයට" ඇලී සිටිය හැකිය. එය ආරක්ෂිතයි.
සර්කෝ

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

64
ක්ෂණික පැතිකඩ පරීක්ෂණයකින් පෙනී යන්නේ, ශුන්‍ය පරීක්ෂණයකින් තොරව ව්‍යාජ දායකත්වයෙන් යුත් සිදුවීම් හසුරුවන්නා විසින් ශුන්‍ය පරීක්ෂණයකින් දායකත්වයෙන් තොර සිදුවීම් හසුරුවන්නාගේ කාලය දළ වශයෙන් 2 ගුණයක් ගත වන බවයි. ශුන්‍ය පරීක්‍ෂණයකින් තොරව බහු විකාශන සිදුවීම් හසුරුවන්නා විසින් ශුන්‍ය පරීක්‍ෂණයක් සහිත තනි විකාශන සිදුවීම් හසුරුවන්නාගේ කාලය 3.5 ගුණයක් පමණ වේ.
පී ඩැඩි

54
සෑම විටම ස්වයං ග්‍රාහකයකු සිටීම මගින් ශුන්‍ය පරීක්‍ෂණයක අවශ්‍යතාවය මෙය වළක්වයි. හිස් සිදුවීමක් ලෙස වුවද මෙය ඔබට අවශ්‍ය නොවන පොදු කාර්යයක් දරයි. ග්‍රාහකයින් නොමැති නම් ඔබට මෙම සිදුවීම කිසිසේත් වෙඩි තැබීමට අවශ්‍ය නැත, සෑම විටම හිස් ව්‍යාජ සිදුවීමක් පළමුවෙන්ම වෙඩි නොතබන්න. මම මෙම නරක කේතය සලකා බලමි.
කීත්

56
ඉහත අදහස් දැක්වීම්වල හේතු නිසා මෙය භයානක යෝජනාවකි. ඔබ ඔබේ කේතය "පිරිසිදු" ලෙස පෙනිය යුතු නම්, ශුන්‍යය පරීක්ෂා කිරීම සඳහා දිගු ක්‍රමයක් භාවිතා කර සිද්ධිය අමතන්න. වෙනස් කළ වරප්‍රසාද ඇති අය අනිවාර්යයෙන්ම මෙම පිළිතුරට අවාසි එකතු කළ යුතුය.
ග්‍රෙග්

304

අනෙක් සියල්ල, ප්ලස්

1) ව්‍යංග ජනකතා (ඇයි ක්‍රම මත මිස පන්ති මත නොවන්නේ?)

void GenericMethod<T>( T input ) { ... }

//Infer type, so
GenericMethod<int>(23); //You don't need the <>.
GenericMethod(23);      //Is enough.

2) එක් පරාමිතියක් සහිත සරල ලැම්බඩාස්:

x => x.ToString() //simplify so many calls

3) නිර්නාමික වර්ග සහ ආරම්භකයින්:

//Duck-typed: works with any .Add method.
var colours = new Dictionary<string, string> {
    { "red", "#ff0000" },
    { "green", "#00ff00" },
    { "blue", "#0000ff" }
};

int[] arrayOfInt = { 1, 2, 3, 4, 5 };

තවත් එකක්:

4) ස්වයංක්‍රීය ගුණාංගවලට විවිධ විෂය පථ තිබිය හැකිය:

public int MyId { get; private set; }

මට මතක් කිරීම ගැන @pzycoman ට ස්තූතියි:

5) නාම අවකාශ අන්වර්ථයන් (ඔබට මෙම විශේෂ වෙනස අවශ්‍ය වනු ඇති බව නොවේ):

using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;

web::Control aWebControl = new web::Control();
win::Control aFormControl = new win::Control();

14
# 3 හි ඔබට ගණන් කළ හැකිය. පරාසය (1,5)
එකෝස්ටෝම්

18
int [] nums = {1,2,3 with සමඟ අරා ආරම්භ කිරීමට ඔබට හැකි වී ඇතැයි මම සිතමි; 1.0 සිට :) "නව" මූල පදය පවා අවශ්‍ය නොවේ
ලූකස්

13
පරාමිතීන් නොමැතිව ලැම්බඩා ද () => DoSomething ();
පැබ්ලෝ රෙටික්

5
මම දෙකම ලබා ගත්තා; ලබා ගන්න; අභ්යන්තර කට්ටලය; } සහ {ලබා ගන්න; ආරක්ෂිත කට්ටලය; }, එබැවින් මෙම රටාව අනුකූල වේ.
කීත්

7
Ir කිර්ක් බ්‍රෝඩ්හර්ස්ට් - ඔබ හරි - new web.Control()මෙම උදාහරණයේ ද ක්‍රියා කරයි. මෙම ::කාරක රීති හමුදා එය ඔබ නමින් පන්තියට හැකි නිසා, එය නාම හෙවත් ලෙස උපසර්ගය ප්රතිකාර කිරීම සඳහා webසහ web::Controlඑම අතර, කාරක රීති තවමත් පින් web.Controlකාරක රීති පන්ති හෝ නාම පරීක්ෂා කිරීමට ද යන්න දන්නේ නැහැ. ඒ නිසා මම නිතරම ::නාම අවකාශ අන්වර්ථ නාම භාවිතා කරන විට භාවිතා කරමි .
කීත්

285

මම "ලෙස" යන මූලික පදය සෑහෙන කාලයක් දැන සිටියේ නැත.

MyClass myObject = (MyClass) obj;

එදිරිව

MyClass myObject = obj as MyClass;

පංතියේ කාස්ට් ව්‍යතිරේකයක් විසි කරනවාට වඩා, ඕබ් මයික්ලාස් නොවේ නම් දෙවැන්න ශුන්‍ය වේ.


42
එය ඕනෑවට වඩා කරන්න එපා. (ටොටයිප්) x හි අර්ථ නිරූපණය අවශ්‍ය වුවද සින්ටැක්ස් වලට වැඩි කැමැත්තක් දක්වන නිසා බොහෝ දෙනෙක් භාවිතා කරන බව පෙනේ.
ස්කොට් ලැන්ග්හැම්

4
එය වඩා හොඳ කාර්ය සාධනයක් ලබා දෙනු ඇතැයි මම විශ්වාස නොකරමි. ඔබ එය පැතිකඩ කර තිබේද? (නිසැකවම එය වාත්තු අසමත් වූ විට සිදු වේ ... නමුත් ඔබ (මයික්ලාස්) වාත්තු භාවිතා කරන විට, අසාර්ථකත්වය සුවිශේෂී වේ .. සහ අතිශය දුර්ලභ ය (ඒවා කිසිසේත් සිදුවුවහොත්), එබැවින් එයින් කිසිදු වෙනසක් සිදු නොවේ.
ස්කොට් Langham

7
මෙය වඩාත් කාර්ය සාධනය වන්නේ සුපුරුදු නඩුව වාත්තු අසමත් වුවහොත් පමණි. එසේ නොමැතිනම් සෘජු වාත්තු (වර්ගය) වස්තුව වේගවත් වේ. සෘජු නළු නිළියන්ට ව්‍යතිරේකයක් විසි කිරීමට වැඩි කාලයක් ගත වේ.
ස්පෙන්ස්

15
"ලෙස" යන පදයේ එකම රේඛා ඔස්සේ ... "is" යතුර ඉතා ප්‍රයෝජනවත් වේ.
dkpatt

28
ඔබට එය අනිසි ලෙස භාවිතා කළ හැකි අතර පසුව ඔබට පෙර අවලංගු කැස්ට්එක්සෙප්ෂන් එකක් තිබිය හැකි වූ විට ඔබේ මාර්ගයෙන් NullReferenceException ලබා ගත හැකිය.
ඇන්ඩ්‍රි රෙනියා

261

මා කැමති කාරණා දෙකක් ස්වයංක්‍රීය ගුණාංග වන බැවින් ඔබට ඔබේ කේතය තව දුරටත් බිඳ දැමිය හැකිය:

private string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

බවට පත්වේ

public string Name { get; set;}

වස්තු ආරම්භකයින් ද:

Employee emp = new Employee();
emp.Name = "John Smith";
emp.StartDate = DateTime.Now();

බවට පත්වේ

Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()}

6
ස්වයංක්‍රීය ගුණාංග සී # 3.0 පමණක් අංගයක් බව සැලකිල්ලට ගත යුතුද?
ජරෙඩ් යාවත්කාලීන කිරීම

21
3.0 සම්පාදකය සමඟ ස්වයංක්‍රීය ගුණාංග හඳුන්වා දෙන ලදී. නමුත් සම්පාදකය 2.0 කේත ප්‍රතිදානය සඳහා සැකසිය හැකි බැවින් ඒවා හොඳින් ක්‍රියාත්මක වේ. පැරණි සම්පාදකයෙකු තුළ ස්වයංක්‍රීය ගුණාංග සහිත 2.0 කේතය සම්පාදනය කිරීමට උත්සාහ නොකරන්න!
ජෝෂුවා ෂැනන්

74
බොහෝ අය නොදැන සිටින දෙයක් නම්, ලබා ගැනීම සහ සැකසීම එකිනෙකට වෙනස් ප්‍රවේශ්‍යතාවයක් තිබිය හැකි බවයි, උදා: පොදු වචන නාමය {ලබා ගන්න; පෞද්ගලික කට්ටලය;}
නාඩර් ෂිරාසි

7
ස්වයංක්‍රීය ගුණාංග සමඟ ඇති එකම ගැටළුව නම් පෙරනිමි ආරම්භක අගයක් සැපයිය නොහැකි බව පෙනේ.
ස්ටයින් Åsmul

7
@ ඒනෙව්ස්: නැහැ. එම පිටුවෙන්: DefaultValueAttribute මඟින් සාමාජිකයෙකුගේ ගුණාංගයේ අගය සමඟ ස්වයංක්‍රීයව ආරම්භ කිරීමට හේතු නොවේ. ඔබේ කේතයේ ආරම්භක අගය සැකසිය යුතුය. [DefaultValue]නිර්භීතව දේපලක් පෙන්විය යුතු දැයි දැන ගැනීමට නිර්මාණකරු සඳහා භාවිතා කරයි (පෙරනිමි නොවන අර්ථය).
රොජර් ලිප්ස්කොම්බ්

254

සාමාන්‍ය වර්ගවල 'පෙරනිමි' යතුර:

T t = default(T);

එහි ප්‍රති results ලය වන්නේ T යනු යොමු වර්ගය නම් 0 ක් වන අතර 0 එය int නම්, එය බූලියන් නම් අසත්‍යය යනාදියයි.


4
ප්ලස්: ටයිප් කරන්න? Nullable <type> සඳහා කෙටිමඟක් ලෙස. පෙරනිමි (int) == 0, නමුත් පෙරනිමි (int?) == null.
හිරු එළිය


220

@ සම්පාදකයාට පවසන්නේ නූලක ඇති ගැලවීමේ අක්ෂර නොසලකා හරින ලෙසයි.

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

ඔබට තිබේ නම්

string s = @"cat
             dog
             fish"

එය සැබවින්ම මුද්‍රණය කරනු ඇත (එයට ඉන්ඩෙන්ටේෂන් සඳහා භාවිතා කරන සුදු අවකාශය පවා ඇතුළත් බව සලකන්න):

cat
             dog
             fish

ඔබ ඉන්ඩෙන්ටේෂන් සඳහා භාවිතා කළ සියලු අවකාශයන් නූලට ඇතුළත් නොවේද?
andy

18
ඔව් එය verbatim string ලෙස හැඳින්වේ.
ජොආන් වෙන්ජ්

4
ප්‍රතිදානය මඟින් මුද්‍රණය වන අවකාශයන් පෙන්වන්නේ නම් එය වඩාත් පැහැදිලි වනු ඇත. දැන් පෙනෙන්නේ නව රේඛා අක්ෂර මුද්‍රණය කර ඇති නමුත් අවකාශය නොසලකා හරින බවයි.
aleemb

සාමාන්‍ය ප්‍රකාශන සහ දිගු SQL විමසුම් වලින් ගැලවීමට ඉතා ප්‍රයෝජනවත් වේ.
ashes999

එය ද සිතියම් {{කිරීමට {හා }}කිරීමට }එය ප්රයෝජනවත් කරමින් string.Format().
ෆෙරුසියෝ

219

මම හිතන්නේ C # (.NET 3.5) හි වඩාත්ම අගය නොකරන ලද සහ එතරම් නොදන්නා අංගයක් වන්නේ ප්‍රකාශන ගස් ය , විශේෂයෙන් ජෙනරික්ස් සහ ලැම්බඩාස් සමඟ සංයෝජනය වූ විට ය. මෙය NInject සහ Moq වැනි නව පුස්තකාල භාවිතා කරන API නිර්මාණය සඳහා ප්‍රවේශයකි.

උදාහරණයක් ලෙස, මට API සමඟ ක්‍රමයක් ලියාපදිංචි කිරීමට අවශ්‍ය බවත් ඒපීඅයි ක්‍රමයේ නම ලබා ගැනීමට අවශ්‍ය බවත් කියමු

මෙම පන්තිය ලබා දී ඇත:

public class MyClass
{
     public void SomeMethod() { /* Do Something */ }
}

මීට පෙර, සංවර්ධකයින් මෙය නූල් සහ වර්ග වලින් (හෝ වෙනත් බොහෝ දුරට නූල් මත පදනම් වූ) කරන බව දැකීම සාමාන්‍ය දෙයක් විය:

RegisterMethod(typeof(MyClass), "SomeMethod");

හොඳයි, ශක්තිමත් යතුරු ලියනය කිරීමේ lack නතාවය නිසා එය උරා ගනී. මා "සමමෙතඩ්" ලෙස නම් කළහොත් කුමක් කළ යුතුද? කෙසේ වෙතත්, දැන් 3.5 දී, මට මෙය තදින් ටයිප් කළ ආකාරයකින් කළ හැකිය:

RegisterMethod<MyClass>(cl => cl.SomeMethod());

රෙජිස්ටර් ක්‍රම පංතිය මේ ආකාරයෙන් භාවිතා කරන Expression<Action<T>>:

void RegisterMethod<T>(Expression<Action<T>> action) where T : class
{
    var expression = (action.Body as MethodCallExpression);

    if (expression != null)
    {
        // TODO: Register method
        Console.WriteLine(expression.Method.Name);
    }
}

මම දැන් ලැම්බඩාස් සහ ප්‍රකාශන ගස් සමඟ ආදරයෙන් බැඳී සිටීමට මෙය එක් ප්‍රධාන හේතුවකි.


3
මට පරාවර්තන උපයෝගිතා පන්තියක් ඇත, එය ෆීල්ඩ්ඉන්ෆෝ, ප්‍රොපර්ටි ඉන්ෆෝ යනාදිය සමඟ සමාන වේ ...
ඔල්මෝ

ඔව්, මෙය විශිෂ්ටයි. EditValue(someEmployee, e => e.FirstName);මගේ ව්‍යාපාර තර්කනයේ මෙන් කේත ලිවීමට මට මෙවැනි ක්‍රම භාවිතා කිරීමට හැකි වූ අතර එම දේපල සංස්කරණය කිරීම සඳහා ViewModel සහ View සඳහා සියලු ජලනල කාර්මික තර්කනය ස්වයංක්‍රීයව ජනනය කර ඇත (එබැවින්, "පළමු නම" යන පෙළ සහිත ලේබලයක් සහ පෙළ බොක්ස් සමඟ පරිශීලකයා නම සංස්කරණය කරන විට පළමු නම දේපල සැකසුම්කරු ලෙස හඳුන්වන බන්ධනයක්, සහ ලබා ගන්නා තැනැත්තා භාවිතා කර දර්ශනය යාවත්කාලීන කරයි). සී # හි බොහෝ නව අභ්‍යන්තර ඩීඑස්එල් සඳහා මෙය පදනම බව පෙනේ.
ස්කොට් විට්ලොක්

4
මම හිතන්නේ මේවා එතරම් අවබෝධයක් නැති තරම් අඩු නොවේ.
ජස්ටින් මෝගන්

ඔබට ක්‍රමයක් ලියාපදිංචි කිරීමට අවශ්‍ය ඇයි? මම මීට පෙර කවදාවත් මෙය භාවිතා කර නැත - මෙය භාවිතා කරන්නේ කොහේද සහ කවදාද?
මූන්කයිට්

208

" අස්වැන්න " මගේ මතකයට එයි. [DefaultValue ()] වැනි සමහර ගුණාංග මගේ ප්‍රියතමයන් අතර වේ.

" Var " මූල පදය තව ටිකක් දන්නා නමුත් ඔබට එය .NET 2.0 යෙදුම්වලද භාවිතා කළ හැකිය (ඔබ .NET 3.5 සම්පාදකය භාවිතා කර එය 2.0 කේතයට ප්‍රතිදානය කරන තාක් කල් ) එතරම් ප්‍රසිද්ධ නැති බව පෙනේ. හොඳින්.

සංස්කරණය කරන්න: කොකොස්, පෙන්වා දීමට ස්තූතියි ?? ක්‍රියාකරු, එය ඇත්තෙන්ම ප්‍රයෝජනවත්. ඒ සඳහා ගූගල් කිරීම තරමක් අපහසු බැවින් (?? දැන් නොසලකා හැර ඇති පරිදි), මෙන්න එම ක්‍රියාකරු සඳහා MSDN ප්‍රලේඛන පිටුව: ?? ක්රියාකරු (C # යොමුව)


14
පෙරනිමි අගයෙහි ප්‍රලේඛනය පවසන්නේ එය ඇත්ත වශයෙන්ම දේපලෙහි වටිනාකම සැකසීම නොවන බවයි. එය දෘශ්‍යකරණයට සහ කේත ජනක යන්ත්‍ර සඳහා සහායකයකු පමණි.
බොරිස් කැලන්ස්

2
DefaultValue සඳහා: මේ අතරතුර, සමහර පුස්තකාල එය භාවිතා කරයි. ASP.net MVC විසින් පාලක ක්‍රියාවක පරාමිතීන් මත DefaultValue භාවිතා කරයි (එය ශුන්‍ය නොවන වර්ග සඳහා ඉතා ප්‍රයෝජනවත් වේ). නිශ්චිතවම කිවහොත්, මෙය කේත උත්පාදක යන්ත්‍රයක් වන බැවින් අගය සකසා ඇත්තේ සම්පාදකයා විසින් නොව එම්වීසී කේතයෙනි.
මයිකල් ස්ටම්

6
සඳහා නම ?? ක්රියාකරු යනු "ශුන්ය සිසිල් කිරීමේ" ක්රියාකරු
ආම්ස්ට්‍රෝංගස්ට්

අස්වැන්න මගේ ප්‍රියතමයි, සිසිල් ක්‍රියාකරු එහි සිටියත්. මට CAS, හෝ එකලස් අත්සන් කිරීම, ශක්තිමත් නම්, GAC ගැන කිසිවක් නොපෙනේ ... මම හිතන්නේ CAS පමණක් C # පමණක් යැයි සිතමි ... නමුත් බොහෝ සංවර්ධකයින්ට ආරක්ෂාව පිළිබඳ කිසිදු හෝඩුවාවක් නොමැත.
BrainSlugs83

197

බොහෝ C # සංවර්ධකයින් 'අහෝසි කළ හැකි' වර්ග ගැන නොදන්නා බව මම සොයා ගතිමි. මූලික වශයෙන්, ශුන්‍ය අගයක් තිබිය හැකි ප්‍රාථමිකයන්.

double? num1 = null; 
double num2 = num1 ?? -100;

එය nullable ද්විත්ව, සකසන්න num1 , ශුන්ය කිරීමට, එවකට නිත්ය ද්විත්ව, සකස් num2 වෙත num1 හෝ -100 නම් num1 ශූන්ය විය.

http://msdn.microsoft.com/en-us/library/1t3y8s4s(VS.80).aspx

නුසුදුසු වර්ගය ගැන තවත් එක් දෙයක්:

DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();

එය ආපසු නූල් වේ. වැඩි විස්තර සඳහා මෙම සබැඳිය පරීක්ෂා කරන්න


1
දිනය ටයිම් අහෝසි කළ නොහැක.
ජේසන් ජැක්සන්

2
එසේනම් "int" යනු System.Int32 සඳහා C # සින්ටැක්ටික් සීනි පමණක්ද? නිදසුනක් ලෙස (සාමාන්‍ය ව්‍යුහයන් භාවිතයෙන් පමණක් කළ නොහැකි) සහ ඒවා යටින් පවතින වර්ගය ලෙස බොක්සිං කිරීම සඳහා, ඒවා ශුන්‍ය කිරීමට සැකසීමට හැකි වන පරිදි, නූල් වර්ග වටා සම්පාදක ආධාරකයක් ඇත.
පී ඩැඩි

4
DP ඩැඩී - ඔව්, int යනු System.Int32 සඳහා සින්ටැක්ටික් සීනි වේ. ඒවා සම්පූර්ණයෙන්ම එකිනෙකට හුවමාරු වේ. === Int32? === අහෝසි කළ හැකි <Int32> === ශුන්‍ය කළ හැකි <int>
cjk

6
@ck: ඔව්, int යනු System.Int32 සඳහා අන්වර්ථයකි, T ලෙස? Nullable <T> සඳහා අන්වර්ථයකි, නමුත් එය හුදෙක් සින්ටැක්ටික් සීනි නොවේ. එය භාෂාවේ නිර්වචනය කළ කොටසකි. අන්වර්ථ නාමය කියවීම පහසු කිරීම පමණක් නොව, අපගේ ආකෘතියට වඩා හොඳින් ගැලපේ. ශුන්‍ය <ඩබල්> දෙගුණයක් ලෙස ප්‍රකාශ කිරීම? අවධාරනය කරන්නේ, මෙහි අඩංගු අගය ද්විත්ව (හෝ විය හැකිය) යන දෙයාකාරය, ද්විත්ව වර්ගය මත ක්ෂණිකව ස්ථාපනය කරන ලද සමහර සාමාන්‍ය ව්‍යුහයන් පමණක් නොවේ. (න්)
පී ඩැඩි

3
... කෙසේ වෙතත්, තර්කය අන්වර්ථයන් ගැන නොවේ (එය දුර්වල ප්‍රතිසමයක් පමණක් යැයි මම සිතමි), නමුත් එම අශෝභන වර්ග - ඔබ කැමති ඕනෑම වාක්‍ය ඛණ්ඩයක් භාවිතා කිරීම ඇත්ත වශයෙන්ම භාෂා අංගයක් මිස ජනක විද්‍යාවේ නිෂ්පාදනයක් නොවේ. ඔබට ශුන්‍යතාවයේ සියලු ක්‍රියාකාරීත්වයන් ප්‍රතිනිර්මාණය කළ නොහැක (ශූන්‍යය, ක්‍රියාකරු ඉදිරියට යැවීම, යටින් පවතින වර්ගයේ හෝ ශුන්‍ය බොක්සිං, ශුන්‍ය සමතුලිතතාවය සහ asක්‍රියාකරුවන් සමඟ අනුකූල වීම ) සාමාන්‍ය විද්‍යාව සමඟ පමණක් ප්‍රතිනිෂ්පාදනය කළ නොහැක . ශුන්‍ය <T> පමණක් මුලික හා තාරකා වලින් far ත්ව ඇත, නමුත් භාෂාවේ කොටසක් ලෙස ශුන්‍ය කළ හැකි සංකල්ප සංකල්පය කික් බූරුවා වේ.
පී ඩැඩි

192

ලේඛනගත නොකළ C # මූල පද ස්වරූපයෙන් සැඟවුණු C # විශේෂාංග කිහිපයක් මෙන්න:

__makeref

__reftype

__refvalue

__arglist

මේවා ලේඛනගත නොකළ C # මූල පද (දෘශ්‍ය ස්ටුඩියෝ පවා ඒවා හඳුනා ගනී!) ජනක විද්‍යාවට පෙර වඩාත් කාර්යක්ෂම බොක්සිං / බොක්සිං සඳහා එකතු කරන ලදී. ඒවා System.TypedReference struct සමඟ සම්බන්ධීකරණයෙන් ක්‍රියා කරයි.

විචල්ය දිග පරාමිති ලැයිස්තු සඳහා භාවිතා කරන __arglist ද ඇත.

බොහෝ දෙනා නොදන්නා එක් දෙයක් වන්නේ System.WeakReference - ඉතා ප්‍රයෝජනවත් පන්තියක් වන අතර එය වස්තුවක් පිළිබඳව සොයා බලන නමුත් කසළ එකතු කරන්නාට එය එකතු කිරීමට ඉඩ දෙයි.

වඩාත්ම ප්‍රයෝජනවත් "සැඟවුණු" ලක්ෂණය වනුයේ අස්වැන්න ආපසු ලබා දෙන යතුරයි. එය සැබවින්ම සැඟවී නැත, නමුත් බොහෝ දෙනෙක් ඒ ගැන නොදනිති. මේ මත ලින්ක් ඉදිකර ඇත; එය හුඩ් යටතේ රාජ්‍ය යන්ත්‍රයක් ජනනය කිරීමෙන් ප්‍රමාදයෙන් ක්‍රියාත්මක කළ විමසුම් සඳහා ඉඩ ලබා දේ. රේමන්ඩ් චෙන් මෑතකදී අභ්‍යන්තර, අමිහිරි තොරතුරු ගැන පළ කළේය .


2
පීටර් බ්‍රොම්බර්ග් විසින් ලේඛනගත නොකළ වචන පිළිබඳ වැඩි විස්තර . ඒවා භාවිතා කිරීමට හේතු තිබේදැයි මට තවමත් වැටහෙන්නේ නැත.
HuBeZa

Ub හියුබෙසා ජනක විද්‍යාවේ දියුණුවත් සමඟ __refType, __makeref සහ __refvalue භාවිතා කිරීමට හොඳ හේතු කිසිවක් නොමැත. .NET 2 හි
ජනක විද්‍යාවට

මැට්, .NET 2 හි ජනක විද්‍යාව හඳුන්වාදීමත් සමඟ, මෙම වචන භාවිතා කිරීමට එතරම් හේතුවක් නැත, මන්ද ඒවායේ අරමුණ වූයේ වටිනාකම් වර්ග සමඟ කටයුතු කිරීමේදී බොක්සිං ක්‍රීඩාවෙන් වැළකී සිටීමයි. HuBeZa හි සබැඳිය බලන්න, එසේම codeproject.com/Articles/38695/UnCommon-C-keywords-A-Look#ud
ගේබ්‍රියෙල් හිමාන්ගෝ

184

පිරිසිදු, ආරක්ෂිත C # වලින් වෘත්තීය සමිති (C ++ හවුල් මතක වර්ගය)

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

[StructLayout(LayoutKind.Explicit)]
public class A
{
    [FieldOffset(0)]
    public byte One;

    [FieldOffset(1)]
    public byte Two;

    [FieldOffset(2)]
    public byte Three;

    [FieldOffset(3)]
    public byte Four;

    [FieldOffset(0)]
    public int Int32;
}

Int32 ක්ෂේත්‍රය හැසිරවීමෙන් ඔබට බයිට් ක්ෂේත්‍රවල අගයන් වෙනස් කළ හැකිය. උදාහරණයක් ලෙස, මෙම වැඩසටහන:

    static void Main(string[] args)
    {
        A a = new A { Int32 = int.MaxValue };

        Console.WriteLine(a.Int32);
        Console.WriteLine("{0:X} {1:X} {2:X} {3:X}", a.One, a.Two, a.Three, a.Four);

        a.Four = 0;
        a.Three = 0;
        Console.WriteLine(a.Int32);
    }

මෙය ප්‍රතිදානය කරයි:

2147483647
FF FF FF 7F
65535

System.Runtime.InteropServices භාවිතයෙන් එක් කරන්න;


7
E ජෝර්ජ්, ඔබ යූනියන් ප්‍රකාශන භාවිතා කරමින් සොකට් හරහා පැරණි යෙදුම් සමඟ සන්නිවේදනය කරන විට පුදුම ක්‍රියා කරයි.
scottm

2
ඕෆ්සෙට් 0 හි int සහ float ලෙස පැවසීම ද අර්ථවත් වේ. ඔබට සමහර විට අවශ්‍ය වන පාවෙන ලක්ෂ්‍ය සංඛ්‍යා බිටු වෙස් මුහුණු ලෙස හැසිරවීමට අවශ්‍ය නම් එය ඔබට අවශ්‍ය වේ. විශේෂයෙන් ඔබට පාවෙන ලක්ෂ්‍ය අංක ගැන අලුත් දේවල් ඉගෙන ගැනීමට අවශ්‍ය නම්.
ජෝන් ලයිඩෙග්‍රන්

2
මෙහි ඇති කරදරකාරී දෙය නම් ඔබ මෙය භාවිතා කිරීමට යන්නේ නම් එය ව්‍යුහයක් වන අතර ආරම්භක ශ්‍රිතයේ සියලුම විචල්‍යයන් සැකසීමට සම්පාදකයා ඔබට බල කරයි. එබැවින් ඔබට තිබේ නම්: පොදු A (int int32) {Int32 = int32; } එය විසි කරනු ඇත "ඇමතුම වෙත පාලනය නැවත ලබා දීමට පෙර 'ක්ෂේත්‍රය' සම්පූර්ණයෙන්ම පැවරිය යුතුය", එබැවින් ඔබ එක් = දෙක = තුන = හතර = 0; එසේම.
manixrock

2
මෙය බොහෝ විට ද්විමය දත්ත සමඟ එහි භාවිතයන් ඇත. මම int32 @ 0 සහිත “පික්සෙල්” ව්‍යුහයක්ද, components 0, 1, 2, සහ 3 සංරචක හතර සඳහා බයිට් හතරක්ද භාවිතා කරමි. රූප දත්ත ඉක්මනින් හා පහසුවෙන් හැසිරවීමට විශිෂ්ටයි.
snarf

57
අවවාදයයි: මෙම ප්‍රවේශය අන්තරායන් සැලකිල්ලට නොගනී. ඒ කියන්නේ ඔබේ C # කේතය සියලුම යන්ත්‍රවල එකම ආකාරයකින් ක්‍රියාත්මක නොවේ. කුඩා එන්ඩියන් CPU වල (අවම වශයෙන් සැලකිය යුතු බයිට් පළමුව ගබඩා කරන), පෙන්වන හැසිරීම භාවිතා කරනු ඇත. නමුත් විශාල එන්ඩියන් CPU වල, ඔබ අපේක්ෂා කළ දෙයට වඩා බයිට් ආපසු හැරෙනු ඇත. නිෂ්පාදන කේතයේදී ඔබ මෙය භාවිතා කරන ආකාරය ගැන පරිස්සම් වන්න - ඔබේ කේතය ඇතැම් ජංගම උපාංග සහ වෙනත් දෘඩාංග වලට අතේ ගෙන යා නොහැකි විය හැකි අතර, පැහැදිලි නොවන ආකාරවලින් කැඩී යා හැක (උදා: ගොනු දෙකක් එකම ආකෘතියකින් පෙනෙන නමුත් ඇත්ත වශයෙන්ම බයිට් ඇණවුම ආපසු හැරවීමත් සමඟ).
රේ බර්න්ස්

175

මූල පද වන විචල්ය නම් සඳහා @ භාවිතා කිරීම.

var @object = new object();
var @string = "";
var @if = IpsoFacto(); 

38
විචල්‍ය නාමයක් ලෙස යතුරු පදයක් භාවිතා කිරීමට ඔබට අවශ්‍ය ඇයි? මෙය කේතය අඩු කියවිය හැකි සහ අපැහැදිලි බවට පත් කරන බව මට පෙනේ.
ජෝන්

41
හොඳයි, එහි ඇති හේතුව නම්, C # මූල පද සාමාජික නාම ලෙස භාවිතා කළ හැකි වෙනත් භාෂාවන් සමඟ අන්තර් ක්‍රියාකාරිත්වය සඳහා CLI ට අවශ්‍ය වීමයි
මාර්ක් සිඩේඩ්

69
ඔබට කවදා හෝ asp.net MVC HTML සහායකයන් භාවිතා කිරීමට සහ HTML පංතියක් නිර්වචනය කිරීමට අවශ්‍ය නම් ඔබට @ පන්තිය භාවිතා කළ හැකි බව දැනගැනීමට ලැබීම සතුටට කරුණකි, එබැවින් එය පන්ති පදය ලෙස හඳුනා නොගනු ඇත
බොරිස් කැලන්ස්

31
දිගු කිරීමේ ක්‍රම සඳහා විශිෂ්ටයි. public static void DoSomething (මෙම තීරුව, මෙම නූල් foo) {...}
ජොනතන් සී ඩිකින්සන්

45
@ ෂිහෝට්කි: වැරදියි. var a = 5; කොන්සෝලය.රයිට්ලයින් () a); මුද්‍රණ 5
ස්ලැක්ස්

167

අවසාන වශයෙන් වාරණයන් හෝ අවසන් කරන්නන් ඇමතීමෙන් තොරව ඔබේ වැඩසටහනෙන් පිටවීමට ඔබට අවශ්‍ය නම් FailFast භාවිතා කරන්න :

Environment.FailFast()

12
මෙම ක්‍රමය මඟින් මතක ඩම්ප් එකක් නිර්මාණය කර වින්ඩෝස් දෝෂ ලොගයට පණිවිඩයක් ලියන බව සලකන්න.
රික්එන්එස්

1
මෙම ක්‍රමය භාවිතා කරන විට අවසාන හෝ යෙදුම් වසම් බෑමේ සිදුවීම් කැඳවනු
නොලැබේ

1
ඉඟිය සඳහා +1, නමුත් මෙය C # නොවේ, එය .NET හි BCL වේ.
අබෙල්

System.Diagnostics.Process.GetCurrentProcess (). Kill () වේගවත්
Tolgahan Albayrak

153

ක්‍රමයකින් නිර්නාමික වර්ග නැවත ලබා දීම සහ පරාවර්තනයකින් තොරව සාමාජිකයින්ට ප්‍රවේශ වීම.

// Useful? probably not.
private void foo()
{
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) });
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges);
}

object GetUserTuple()
{
    return new { Name = "dp", Badges = 5 };
}    

// Using the magic of Type Inference...
static T AnonCast<T>(object obj, T t)
{
   return (T) obj;
}

42
ඇත්තෙන්ම ඔබට කිසිවක් ලැබෙන්නේ නැත. එය ඇත්තෙන්ම භයානක ය. GetUserTuple විවිධ වර්ග නැවත ලබා දීම සඳහා වෙනස් කර ඇත්නම් කුමක් කළ යුතුද? ධාවන වේලාවේදී රංගනය අසාර්ථක වනු ඇත. C # /. Net පිළිබඳ විශිෂ්ට දේවලින් එකක් වන්නේ සම්පාදනය කරන වේලාව පරීක්ෂා කිරීමයි. නව වර්ගයක් නිර්මාණය කිරීම වඩා හොඳ වනු ඇත.
ජේසන් ජැක්සන්

9
Ason ජේසන් මා කීවේ එය බොහෝ විට ප්‍රයෝජනවත් නොවන නමුත් එය පුදුම සහගතය (මම සැඟවී ඇතැයි සිතුවෙමි).
ඩෙනිස් ෆිලිප්ස්

31
සිසිල් වුවත්, මෙය තරමක් දුර්වල නිර්මාණ තේරීමක් සේ පෙනේ. ඔබ මූලික වශයෙන් නිර්නාමික වර්ගය ස්ථාන දෙකකින් අර්ථ දක්වා ඇත. එම අවස්ථාවේදී, සැබෑ ව්‍යුහයක් ප්‍රකාශ කර එය කෙලින්ම භාවිතා කරන්න.
පෝල් ඇලෙක්සැන්ඩර්

6
E ජෝර්ජ්: එවැනි සමුළුවක් හැඳින්වෙන්නේ ... struct ලෙසද?
ආර්. මාටින්හෝ ෆර්නැන්ඩස්

2
මෙම උපක්‍රමය 'නියැදියෙන් වාත්තු කිරීම' ලෙස නම් කර ඇති අතර නිර්නාමික වර්ගය නැවත ලබා දෙන ක්‍රමය වෙනත් එකලස් කිරීමක පිහිටා තිබේ නම් එය ක්‍රියා නොකරනු ඇත.
ඩෙස්කෝ

146

සාමාන්‍ය ප්‍රකාශන සහ ගොනු මාර්ග සඳහා මෙන්න ප්‍රයෝජනවත් එකක්:

"c:\\program files\\oldway"
@"c:\program file\newway"

@ සම්පාදකයාට පවසන්නේ නූලක ඇති ගැලවීමේ අක්ෂර නොසලකා හරින ලෙසයි.


27
එසේම, @ නියතයක් ඇතුළත නව රේඛා පිළිගනී. නූලකට බහු ස්ක්‍රිප්ට් එකක් පැවරීමේදී පරිපූර්ණයි.
ටෝර් හෝගන්

11
උද්ධෘත සලකුණකින් ගැලවීමට ද අමතක නොකරන්න, වෙනත් වචන වලින් කිවහොත් ඒවා දෙගුණ කරන්න. [කේතය] var කැන්ඩි = @ "මම කැමතියි" "රතු" "කැන්ඩි වේවැල්."; [/ කේතය]
ඩේව්

5
මම Path.Combine සමඟ මාර්ග තැනීමට නැඹුරු වෙමි. මම අනිවාර්යයෙන්ම re regex සඳහා භාවිතා කරමි!
ඩෑන් මැක්ලේන්

6
ew නව, යතුරු පදයක් වෙනුවට විචල්‍යයකි: isthis, @int, @ Return, terinterface ... එසේ ය :)
IAbstract

මෙය ළඟට එන්නේ නැත: නමුත් C # රසිකයින්, ඇබ්බැහි වූවන්, විශේෂ experts යන් පවා නොදන්නා C # හි වඩාත්ම සැඟවුණු අංග හෝ උපක්‍රම මොනවාද?
publicgk

141

මික්සින්. මූලික වශයෙන්, ඔබට පන්ති කිහිපයකට අංගයක් එක් කිරීමට අවශ්‍ය නම්, නමුත් ඒ සියල්ලටම එක් මූලික පන්තියක් භාවිතා කළ නොහැකි නම්, එක් එක් පන්තියට අතුරු මුහුණතක් ක්‍රියාත්මක කිරීමට ලබා ගන්න (සාමාජිකයන් නොමැතිව). ඉන්පසු, අතුරු මුහුණත සඳහා දිගු කිරීමේ ක්‍රමයක් ලියන්න , එනම්

public static DeepCopy(this IPrototype p) { ... }

ඇත්ත වශයෙන්ම, යම් පැහැදිලි කිරීමක් කැප කර ඇත. නමුත් එය ක්රියා කරයි!


4
ඔව්, මම හිතන්නේ මෙය දිගු කිරීමේ ක්‍රමවල සැබෑ බලයයි. ඒවා මූලික වශයෙන් අතුරු මුහුණත් ක්‍රම ක්‍රියාත්මක කිරීමට ඉඩ දෙයි.
ජෝන් බුබ්රිස්කි

ඔබ NHibernate (හෝ Castle ActiveRecord) භාවිතා කරන්නේ නම් මෙයද පහසු වන අතර ඔබේ එකතු කිරීම් සඳහා අතුරු මුහුණත් භාවිතා කළ යුතුය. මේ ආකාරයෙන් ඔබට එකතු කිරීමේ අතුරුමුහුණත් වලට හැසිරීම ලබා දිය හැකිය.
රයන් ලුන්ඩි

වාර්තාව සඳහා, ලින්ක් ක්‍රම සියල්ලම ක්‍රියාත්මක වන්නේ එයයි.
WCWedin

NHibernate හෝ Castle ActiveRecord හි එකතු කිරීමේ අතුරුමුහුණත් සමඟ දිගු කිරීමේ ක්‍රම භාවිතා කරමින් මා ඉහත සඳහන් කළ දේ ගැන කතා කරන සබැඳියක් මෙන්න: devlicio.us/blogs/billy_mccafferty/archive/2008/09/03/…
රයන් ලුන්ඩි

7
ඔවුන් දිගු කිරීමේ දේපල වලට ඉඩ දුන්නේ නම් පමණි !!!! කියවීමට පමණක් ඇති දේපලක් ලෙස අයැද සිටි දීර් extension ක්‍රමයක් ලිවීමට මා අකමැති විය ....
ජෝන් ගිබ්

130

කිසිවෙකු කවදාවත් Nullable <bool> භාවිතා කිරීමට කැමති ඇයිදැයි විශ්වාස නැත. :-)

ඇත්ත, අසත්‍ය, FileNotFound ?


87
පරිශීලකයෙකු ඔව් නැත ප්‍රශ්නයකට පිළිතුරු දෙනු ඇතැයි අපේක්ෂා කරන්නේ නම් ප්‍රශ්නයට පිළිතුරු
නොලැබුනේ

22
වගු තීරු බොහෝ විට අහෝසි කළ හැකි දත්ත සමුදායක් සමඟ අන්තර්ක්‍රියා කිරීම සඳහා අහෝසි කළ හැකි වර්ග ඉතා පහසුය.
tuinstoel

11
ඔව්, නැහැ, සමහර විට?
ඩෑන් බ්ලෙයාර්

21
ත්රී ස්ටේට් චෙක් බොක්ස් හි ගබඩා අගයන්
ෂිමී වයිට්ෂැන්ඩ්ලර්

8
SQL හි මෙන්: ඔව් / නැත / නොදන්නා.
erikkallen

116

මෙය වැරදි ලෙස නම් කර ඇති තරමට "සැඟවී" නැත.

"සිතියම", "අඩු කිරීම" සහ "පෙරණය" යන ඇල්ගොරිතම කෙරෙහි වැඩි අවධානයක් යොමු කෙරේ. බොහෝ දෙනා නොදන්නා දෙය නම් .නෙට් 3.5 මෙම ඇල්ගොරිතම තුනම එකතු කළ නමුත් එය ඔවුන්ට ලින්ක් හි කොටසක් යන කාරණය මත පදනම්ව ඔවුන්ට SQL-ish නම් ලබා දී ඇත.

"map" =>
දත්ත එක් ආකාරයකින් තවත් ආකාරයකට පරිවර්තනය කිරීම තෝරන්න

"අඩු කරන්න" =>
සමස්ථ අගයන් තනි ප්‍රති .ලයකට එකතු කරයි

"filter" =>
නිර්ණායකයක් මත දත්ත පෙරහන් කරන තැන

පුනරාවර්තනය සහ කොන්දේසි ලබා ගැනීමට භාවිතා කළ එකතු කිරීම් සඳහා පේළිගත වැඩ කිරීමට ලින්ක් භාවිතා කිරීමේ හැකියාව ඇදහිය නොහැකි තරම් වටිනා ය. සියලුම ලින්ක් දිගු කිරීමේ ක්‍රම මඟින් ඔබේ කේතය වඩාත් සංයුක්ත හා නඩත්තු කළ හැකි අයුරු ඉගෙන ගැනීම වටී.


1
තෝරන්න මොනෑඩ් වල "ආපසු" ශ්‍රිතය මෙන් ක්‍රියා කරයි. Stackoverflow.com/questions/9033/hidden-features-of-c#405088
මාර්ක් සිඩේඩ්

1
"තෝරන්න" භාවිතා කිරීම අවශ්‍ය වන්නේ ඔබ SQLish සින්ටැක්ස් භාවිතා කරන්නේ නම් පමණි. ඔබ ව්‍යාප්ති ක්‍රමයේ සින්ටැක්ස් භාවිතා කරන්නේ නම් - someCollection.Where (item => item.Price> 5.99M) - තෝරාගත් ප්‍රකාශ භාවිතා කිරීම අවශ්‍ය නොවේ.
බ්‍රැඩ් විල්සන්

7
Rad බ්‍රැඩ්, එය (කොහේද) පෙරහන් මෙහෙයුමකි. තෝරා නොගෙන සිතියම් මෙහෙයුමක් කිරීමට උත්සාහ කරන්න ...
එලොෆ්

2
මගේ මතය අනුව C # ට සිදු වූ විශාලතම දෙය LINQ ය: stackoverflow.com/questions/2398818/…
Leniel Maccaferri

1
සමස්ථයේ කුඩාම අත්සන වන්නේ “අඩු කිරීම” ශ්‍රිතයයි, සමස්ථයේ මැද අත්සන වඩා බලවත් “ගුණයකින්” ක්‍රියා කරයි!
බ්‍රෙට් විඩ්මියර්

115
Environment.NewLine

පද්ධති ස්වාධීන නව රේඛා සඳහා.


10
මේ පිළිබඳ කරදරකාරී දෙය නම්, එය සංයුක්ත රාමුවට ඇතුළත් නොවීමයි.
ස්ටෝර්මෙට්

14
මෙය යෙදුමේ ධාරක වේදිකාවට විශේෂිත බව පෙන්වා දීම වටී - එබැවින් ඔබ වෙනත් පද්ධතියක් සඳහා අදහස් කරන දත්ත නිර්මාණය කරන්නේ නම්, ඔබ සුදුසු පරිදි \ n හෝ \ r \ n භාවිතා කළ යුතුය.
Mesh

මෙය .NET හි BCL හි කොටසකි, C # per se හි අංගයක් නොවේ.
අබෙල්

111

ඔබ සංගීත භාණ්ඩයක් තුළ කැරලි වරහන් භාවිතා කිරීමට උත්සාහ කරන්නේ නම්.

int foo = 3;
string bar = "blind mice";
String.Format("{{I am in brackets!}} {0} {1}", foo, bar);
//Outputs "{I am in brackets!} 3 blind mice"

19
Y කයිරලෙසා: ඇත්ත වශයෙන්ම ඔව්, ඒවා වරහන්, නමුත් “කැරලි වරහන්” යනු ඔවුන්ට විකල්ප නමකි. [හා ]කොටු වරහන් වන අතර, <සහ >කෝණික වරහන් වේ. En.wikipedia.org/wiki/Bracket බලන්න .
icktoofay

4
ඔබ හරි. නමුත් මම අදහස් දක්වන විට, එය "කැරලි" වරහන් නොකියයි.
රයන් ලුන්ඩි

2
පෙන්වා දීමට ඉතා හොඳයි. මගේ පළමු සංගීත භාණ්ඩය මතක තබා ගන්න. මේවායින් ගැලවීම සිදු කරන්නේ {{සහ} using භාවිතා කිරීමෙන් බව මම දැනගත් පසු මම ඉතා සතුටට පත්වෙමි :)
ගර්ට්ජන්

Muahahahaa ... ක්‍රමලේඛනය දැනටමත් අවුරුදු 3 ක .Net සහ මම මෙය දැන සිටියේ නැත. : ඩී
ආර්නිස් ලැප්සා

ගැලවීමේ අනුපිළිවෙලට සමානව ක්‍රියා කරන “කැරලි” වරහන් ??
ප්‍රතික්

104
  1. ?? - සමතුලිත ක්‍රියාකරු
  2. භාවිතා කිරීම ( ප්‍රකාශය / විධානය ) - විසුරුවා හැරීම ඇමතීමට වඩා භාවිතා කළ හැකි විශිෂ්ට වචන පදය
  3. readonly - වැඩිපුර භාවිතා කළ යුතුය
  4. netmodules - ඉතා නරකයි Visual Studio හි කිසිදු සහායක් නොමැත

6
භාවිතා කිරීම වඩාත් පහසු නූලකට අන්වර්ථ නාමයක් අන්වර්ථ කිරීමටද භාවිතා කළ හැකිය, එනම්: ZipEncode = MyCompany.UtilityCode.Compression.Zip.Encoding භාවිතා කිරීම; මෙහි තවත් බොහෝ දේ ඇත: msdn.microsoft.com/en-us/library/sf0df423.aspx
ඩේව් ආර්.

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

2
ඔබ # 1 ට නමක් කැමති නම් (ඔබ ත්‍රිමාණ ක්‍රියාකරු සමඟ කළ පරිදි), ?? null coalescing operator ලෙස හැඳින්වේ.
ජේ. ස්ටීන්

4
Uc ලූකස්ආර්ඩ්වාර්ක්: ජේ ස්ටීන් සඳහන් කළ පරිදි එය ශුන්‍ය සිසිලන ක්‍රියාකරු ලෙස හැඳින්වේ. ඒ සඳහා සොයන්න!
kokos

1
සෙවීමට ?? ගූගල් උත්සාහ කරන්න: google.com/search?q=c%23+%3F%3F+operator
backslash17

103

D එඩ්, මම මෙය පළ කිරීම ගැන ටිකක් පසුබට වෙමි. කෙසේ වෙතත්, මම ඔබේ කේත සාම්පලයේ එය පෙන්වා දෙමි:

MyClass c;
  if (obj is MyClass)
    c = obj as MyClass

ඔබ 'is' භාවිතා කිරීමට යන්නේ නම්, 'as' භාවිතා කරමින් ආරක්ෂිත වාත්තු කිරීමක් සමඟ එය අනුගමනය කරන්නේ ඇයි? ඔබ ඇත්ත වශයෙන්ම මයික්ලාස් බව තහවුරු කර ඇත්නම්, ව්‍යාජ සම්මත වාත්තු:

c = (MyClass)obj

... කිසි විටෙකත් අසාර්ථක නොවනු ඇත.

ඒ හා සමානව, ඔබට මෙසේ පැවසිය හැකිය:

MyClass c = obj as MyClass;
if(c != null)
{
   ...
}

.NET හි අභ්‍යන්තරය ගැන මට ප්‍රමාණවත් දැනුමක් නැත, නමුත් මගේ සහජ බුද්ධිය මට පවසන්නේ මෙය උපරිම ආකාරයේ වර්ග දෙකක මෙහෙයුම් උපරිම එකක් දක්වා අඩු කරන බවයි. සැකසුම් බැංකුව දෙයාකාරයෙන්ම බිඳ දැමිය නොහැක. පුද්ගලිකව, මම හිතන්නේ අවසාන ස්වරූපය ද පිරිසිදු බව පෙනේ.


16
වාත්තු කිරීම නිශ්චිත වර්ගයට නම් (වස්තුව "A" වන විට "A" වෙතට දමන්න, එයින් ව්‍යුත්පන්න නොවේ), cast ජු වාත්තු "as" ට වඩා ~ 3x වේගවත් වේ. ව්‍යුත්පන්න වර්ගයක් වාත්තු කරන විට (වස්තුව "බී" වන විට "ඒ" වෙත වාත්තු වන අතර එය "ඒ" වෙතින් ව්‍යුත්පන්න වේ), cast ජු වාත්තු "0.1" ට වඩා මන්දගාමී වේ. "යනු", පසුව "ලෙස" යනු මෝඩය.
පී ඩැඩි

2
නැත, නමුත් ඔබට "if ((c = obj ලෙස MyClass)! = Null)" ලිවිය හැකිය.
ඩේව් වැන් ඩෙන් අයින්ඩේ

10
isහා asපරිශීලක නීති ක්රීයාත්මක වන කරන්නේ නැහැ. ඉතින්, ඉහත කේතය isක්‍රියාකරුගෙන් විමසනුයේ Obj ව්‍යුත්පන්න MyClass වෙතින් (හෝ ව්‍යංග පද්ධතිය අර්ථ දක්වා ඇති වාත්තු තිබේද). එසේම, isඅසමත් වේ null. මෙම කේත අවස්ථා දෙකම ඔබේ කේතයට වැදගත් විය හැකිය. නිදසුනක් ලෙස, ඔබට ලිවීමට අවශ්‍ය විය හැකිය: if( obj == null || obj is MyClass ) c = (MyClass)obj; නමුත් මෙය ඊට වඩා බෙහෙවින් වෙනස් ය: try { c = (MyClass)obj; } catch { }මන්ද යත්, කලින් පරිශීලකයා විසින් අර්ථ දක්වා ඇති පරිවර්තනයන් සිදු නොකරන නමුත්, දෙවැන්න එසේ වනු ඇත. නොමැතිව nullචෙක්පත්, හිටපු ද සකස් කර නොගන්නා cවිට objnull.
ඇඩම් ලූටර්

2
IL හි, කාස්ට් එකක් CASTCLASS වෙත යන නමුත් ISINST උපදෙස් වලට / යන්න.
ජෝන් ගිබ්

5
කිසිදු වැරැද්දක් නොමැති බව තහවුරු කර ගැනීම සඳහා මම මේ සඳහා පරීක්ෂණයක් කළෙමි, වාත්තු IEnumerable<int>කිරීම List<int>සහ object( new object()) වෙත වාත්තු කිරීම IEnumerable<int>: සෘජු වාත්තු: 5.43ns, is-> වාත්තු ලෙස: 6.75ns, වාත්තු ලෙස: 5.69ns. ඉන්පසු අවලංගු කැස්ට් පරීක්ෂා කිරීම: සෘජු වාත්තු: 3125000ns, වාත්තු ලෙස: 5.41ns. නිගමනය: 1% සාධකය ගැන කරදර වීම නවත්වන්න, ඔබ භාවිතා කරන බවට වග බලා ගන්න / වාත්තු අවලංගු විය හැකි විට මෙන්, හේතු ව්‍යතිරේක (හසුරුවනු ලැබුවහොත්) වාත්තු කිරීමට සාපේක්ෂව ඉතා මන්දගාමී වේ, අපි කතා කරන්නේ 578000 සාධකය මන්දගාමී වේ. අවසාන කොටස මතක තබා ගන්න, ඉතිරි කොටස වැදගත් නැත (.නෙට්
එෆ්ඩබ්ලිව්

98

සමහර විට දියුණු තාක්ෂණයක් නොව, මා නිතරම පිස්සු වට්ටවන දෙයක් මා දකිනවා:

if (x == 1)
{
   x = 2;
}
else
{
   x = 3;
}

ensed නීභවනය කළ හැක්කේ:

x = (x==1) ? 2 : 3;

10
මගේ කණ්ඩායමේ ත්‍රිමාණ ක්‍රියාකරු තහනම් කර ඇත. සමහර අය එයට කැමති නැත, ඒ මන්දැයි මට කවදාවත් නොතේරුණි.
ජස්ටින් ආර්.

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

16
x ++ ට ensed නීභවනය කළ හැකිය; හරි ඒක තේරුමක් නැහැ ^^
ප්‍රංශුවා

5
U ගුයිලූම්: x: x = 2 + System.Math.Min (1, System.Math.Abs ​​(x-1)) හි සියලු අගයන් සඳහා ගණනය කිරීම;
mbeckish

38
එය නොවේ - එය ඇත්තටම "කොන්දේසි ක්රියාකරු" ලෙස තියෙන්නේ ඉතා එය තර්ක තුනක් ගත නිසා මිශ්ර ක්රියාකරු. en.wikipedia.org/wiki/Conditional_operator
Blorgbeard
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.