C # හි නූල් සහ නූල් අතර වෙනස කුමක්ද?


6514

උදාහරණය ( නඩුව සටහන් කරන්න ):

string s = "Hello world!";
String s = "Hello world!";

එක් එක් භාවිතය සඳහා මාර්ගෝපදේශ මොනවාද? වෙනස්කම් මොනවාද?


72
@ORMapper, නමුත් සත්‍යය stringවන්නේ එය C # ව්‍යාකරණයේ ශබ්දකෝෂ ව්‍යුහයක් වන අතර එය වර්ගයකි. කිසියම් පිරිවිතරයක සඳහන් කර ඇති පැහැදිලි වෙනසක් නොසලකා, කිසියම් අවිනිශ්චිතතාවයකට අනුගත විය හැකි මෙම ව්‍යංග වෙනස තවමත් පවතී. බීසීඑල් හි කිසියම් පංතියක් සඳහා සලකා බැලීමට (තරමක්) බැඳී නොසිටින අයුරින් භාෂාවම සහාය විය යුතුය . System.Stringstring
කිර්ක් වොල්

106
@KirkWoll: භාෂාව පිරිවිතරයන් අනුව, භාෂාව ම කළ යුතුයි සලකා stringඑම ශ්වවිද්යාලය වර්ගය ලෙස හරියටම එම විය System.String, වෙන කිසිවක් නැත. එය කිසිසේත් අපැහැදිලි නොවේ. ඇත්ත වශයෙන්ම, ඔබට C # ව්‍යාකරණ භාවිතා කරමින් ඔබේම සම්පාදකය ක්‍රියාත්මක කළ හැකි අතර, C # භාෂා පිරිවිතරයේ අර්ථ දක්වා ඇති දේට සම්බන්ධ නැති අත්තනෝමතික දෙයක් සඳහා එවැනි ටෝකන සියල්ලම භාවිතා කළ හැකිය. කෙසේ වෙතත්, එහි ප්‍රති language ලයක් වන භාෂාව C # පෙනුමක් පමණක් වනු ඇත, එය C # ලෙස සැලකිය නොහැක.
හෝ සිතියම

88
stringපද්ධතිය සඳහා විධානයක් නොමැතිව ඔබට භාවිතා කළ හැකිය . ඔබට එය කළ නොහැක String.
විල්සු

14
ඇල්ගොල් සහ ෆෝට්රාන් වලින් පැමිණෙන කෙනෙකුට, මෙම සාකච්ඡාවෙන් පෙනී යන්නේ යම්කිසි වැරැද්දක් ඇති stringබවයි. එය කෙටියෙන් දැක්වීමට අවශ්‍ය වේ System.String, නමුත් අන්වර්ථයක් ලෙස එය තරමක් සමාන බව පෙනේ, නමුත් හරියටම එකම දේ නොවේ. C # වසර ගණනාවකට පසු, නමුත්, මම එය හුදෙක් භාවිතා කිරීම ආරක්ෂාකාරී වන කියන්න පුලුවන්, stringසහ string.Format()ගැන කරදර නොවේ System.String.
රෝලන්ඩ්

8
An සංගීතා ඔබ කියන්නේ කුමක්ද? මෙම System.Stringපන්තිය තවමත් පවතී, සහ stringමූල පදය තවමත් ඒ සඳහා අන්වර්ථ වේ. හරියට System.Int32සහ වගේ int. ඒවා වචනාර්ථයෙන් එකම දෙයකි.
ක්‍රේග්

Answers:


6107

stringසඳහා C # හි අන්වර්ථයකි System.String.
එබැවින් තාක්ෂණික වශයෙන් කිසිදු වෙනසක් නොමැත. එය int එදිරිව System.Int32 .

මාර්ගෝපදේශ වලට අනුව, stringඔබ වස්තුවක් ගැන සඳහන් කරන ඕනෑම වේලාවක භාවිතා කිරීම සාමාන්‍යයෙන් නිර්දේශ කෙරේ .

උදා

string place = "world";

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

උදා

string greet = String.Format("Hello {0}!", place);

මයික්‍රොසොෆ්ට් ඔවුන්ගේ උදාහරණ වල භාවිතා කිරීමට පෙළඹෙන විලාසය මෙයයි .

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


163
ඔබ ස්ටයිල්කොප් භාවිතා කිරීමට තීරණය කර එය අනුගමනය කරන්නේ නම්, එමඟින් භාෂාවට විශේෂිත වර්ග භාවිතා කිරීමට කියනු ඇත. - ඉතින් C # ඔබ (ඒ වෙනුවට, සංගීත වල) නූල්, int (ඒ වෙනුවට Int32 ක), පාවෙන (ඒ වෙනුවට තනි වන) සිදුවේවි stylecop.soyuz5.com/SA1121.html
ඩොමිනික් Zukiewicz

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

37
විෂුවල් ස්ටුඩියෝ 2015 පවසන්නේ String.Format string.Format ලෙස වෙනස් කළ යුතු බවයි, එබැවින් මම හිතන්නේ මයික්‍රොසොෆ්ට් ඒ පැත්තට යයි. ස්ථිතික ක්‍රම සඳහා මම සෑම විටම නූල් භාවිතා කර ඇත.
සාමි කුමොනෙන්

32
මම මේවා කියවා ඇති විට අදහස් කිහිපයක් වැරදියි. RA DRAirey1 කාලයාගේ ඇවෑමෙන්, පැරණි ක්‍රමය තවමත් හොඳම බව ඔබට පෙනී යනු ඇත, ඔබ සැක කරන්නේ නම් දෘශ්‍ය ස්ටුඩියෝ භාවිතා නොකර C # කේතය ලිවීමට උත්සාහ කරමි. එය සැබවින්ම කළ නොහැකි අතර වෙබ් සංවර්ධන කටයුතුවලදී වරින් වර මතුවන තත්වයක්. L ව්ලැඩ් ඔබට නූල් භාවිතා කිරීමට කිසිවක් ආනයනය කිරීමට අවශ්‍ය නැත. @ අබි ඔබේ අදහස අර්ථ විරහිත වන අතර ඒ හා සමානවම සත්‍ය වේ string.Format(). L ක්ලිටොස් ජී නැත, එය සත්‍ය නොවේ. ඒවා සියල්ලම එකම ලෙස ක්‍රියා කරයි.
krowe2

46
ඇත්ත වශයෙන්ම වෙනසක් ඇති බවට ප්‍රකාශයක් එකතු කළ හැකිද? උදාහරණයක් ලෙස: nameof(string)සම්පාදනය nameof(String)නොකරනු ඇත.
ජෙරොයින් වැනේවෙල්

3441

සම්පුර්ණත්වය සඳහා, මෙන්න අදාළ තොරතුරු මොළයක් දමයි ...

අනෙක් අය සඳහන් කර ඇති පරිදි, stringඅන්වර්ථයකි System.String. ඒවා එකම කේතයකට සම්පාදනය කරයි, එබැවින් ක්‍රියාත්මක කිරීමේ වේලාවේ කිසිදු වෙනසක් නොමැත. මෙය C # හි අන්වර්ථයන්ගෙන් එකකි. සම්පූර්ණ ලැයිස්තුව:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

හැරුණු විට stringසහ objectඅන්වර්ථයන් සියල්ලම වටිනාකමින් යුක්ත වේ. decimalඅගය වර්ගයකි, නමුත් සීඑල්ආර් හි ප්‍රාථමික වර්ගයක් නොවේ. අන්වර්ථයක් නොමැති එකම ප්‍රාථමික වර්ගයයි System.IntPtr.

පිරිවිතරයේ දී, අගය වර්ගයේ අන්වර්ථයන් "සරල වර්ග" ලෙස හැඳින්වේ. සෑම සරල වර්ගයකම නියත අගයන් සඳහා සාහිත්‍යය භාවිතා කළ හැකිය; වෙනත් කිසිදු වටිනාකමක් ඇති වචනාර්ථයෙන් ආකෘති නොමැත. (මෙය VB සමඟ සසඳන්න, එය DateTimeවචනාර්ථයට ඉඩ සලසයි , ඒ සඳහා අන්වර්ථයක් ද ඇත.)

ඔබ ගැන එක කොන්දේසියන් ඇත ඇති වූ යොමුවීම් භාවිතා කිරීමට: සුවිශේෂව ක නිඛිල ගේ යටින් වර්ගය නියම විට. උදාහරණයක් වශයෙන්:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

මහ බඩවැල ද විය යුතුය පසු කොටසක් - ඒක පිරිවිතර නිර්වචනය නිඛිල ප්රකාශ මාර්ගය පිළිබඳ කාරණයක් වේ අවියෝජනීය-වර්ගය එක් සංකේත වන නිෂ්පාදනය, sbyte, byte, short, ushort, int, uint, long, ulong, charඑය විරුද්ධ ලෙස ... වර්ගය ලෙස නිෂ්පාදනය උදාහරණයක් ලෙස විචල්‍ය ප්‍රකාශන භාවිතා කරයි. එය වෙනත් වෙනසක් දක්වන්නේ නැත.

අවසාන වශයෙන්, එය භාවිතා කළ යුතු විට: පුද්ගලිකව මම ක්‍රියාත්මක කිරීම සඳහා සෑම තැනකම අන්වර්ථ නාම භාවිතා කරමි, නමුත් ඕනෑම API සඳහා CLR වර්ගය. ක්‍රියාවට නැංවීමේදී ඔබ භාවිතා කරන දේ එතරම් වැදගත් නැත - ඔබේ කණ්ඩායම අතර අනුකූලතාව හොඳයි, නමුත් වෙන කිසිවෙකු එය ගණන් ගන්නේ නැත. අනෙක් අතට, ඔබ API එකක වර්ගයක් ගැන සඳහන් කරන්නේ නම්, ඔබ එය භාෂා-මධ්‍යස්ථ ආකාරයකින් සිදු කිරීම ඇත්තෙන්ම වැදගත් ය. හැඳින්වෙන ක්‍රමයක් ReadInt32නිසැක ය, එහෙත් හැඳින්වෙන ක්‍රමයකට ReadIntඅර්ථ නිරූපණය අවශ්‍ය වේ. අමතන්නාට උදාහරණයක් ලෙස intඅන්වර්ථයක් අර්ථ දක්වන භාෂාවක් භාවිතා කළ හැකිය Int16. මෙම .NET රාමුව නිර්මාණකරුවන් මෙම රටාව, අතුරුදහන් වීම 'තුළ හොඳ උදාහරණ අනුගමනය BitConverter, BinaryReaderහා Convertපන්ති.


82
එනුම් සමඟ උරුමයේ තත්වය සිත්ගන්නා සුළුය. ගණනය කිරීම් සඳහා අන්වර්ථය භාවිතා කළ යුත්තේ මන්දැයි ඔබට ලේඛනගත කළ හැකිද? නැත්නම් මෙය දන්නා දෝෂයක්ද?
ජරෙඩ්පාර්

149
එය පිරිවිතරයේ 14.1 වගන්තියේ ඇත (එය දිගු බැවින් මට මෙහි පහසුවෙන් උපුටා දැක්විය නොහැක). ඔබට අන්වර්ථය භාවිතා කළ යුතු බව එය පැහැදිලිවම නොකියයි, නමුත් අන්වර්ථයන් ඔවුන්ගේ වර්ග ලෙස සලකනු ලැබේ. මේ සියල්ල ටිකක් අමුතුයි.
ජෝන් ස්කීට්

32
IpPiPeep විශාල උඩු යටිකුරු කිරීම් වලට වඩා විශ්මය ජනක දෙය නම් පුදුමාකාර අඩු පහළ අගයන්ය (ඉහළම තනතුරු 5 හි මුළු උඩු යටිකුරු 2000 ට වඩා ඇති බව සලකන්න, නමුත් ඒ සියල්ල අතර 1 අඩු අගයක් පමණි). ඕනෑම ප්‍රජාවක සෑම විටම "වෛර කරන්නන්" සිටින බවට ඔබ සිතන විට, එය ඇත්තෙන්ම ඇදහිය නොහැකි දෙයක් ලෙස මට පෙනේ.
corsiKa

40
අතර සිත්ගන්නා වෙනස stringහා Stringබවයි string' is a keyword in c#, so you can not use it as a variable name.For Ex: ; string string = "හායි," //compiler error, but නූල් වචන = "හායි"; `පිළිගත හැකි ය, Stringහඳුනාගැනීමක් යතුරු පදයක් නොවේ.
සංජීව් රායි

33
An සංජීව්රායි: ඔව්. @stringහදුනාගැනීමක් සෑදීමට ඔබට භාවිතා කළ හැකිය string. එය එක්තරා ආකාරයක ගැලවීමේ යාන්ත්‍රණයක්.
ජෝන් ස්කීට්

716

Stringසඳහා කි්රයා System.Stringඅතර එය .NET Framework වර්ගය වේ. සඳහා C # භාෂාවේ stringඅන්වර්ථයකිSystem.String . මේ දෙකම System.StringIL (අතරමැදි භාෂාව) සමඟ සම්පාදනය කර ඇති බැවින් වෙනසක් නැත. ඔබ කැමති දේ තෝරාගෙන එය භාවිතා කරන්න. ඔබ C # හි කේත කරන්නේ නම්, මම කැමතියි stringඑය C # වර්ගයේ අන්වර්ථයක් වන අතර C # ක්‍රමලේඛකයින් විසින් හොඳින් දන්නා කරුණකි.

( int, System.Int32) යනාදිය ගැන මටත් එයම කිව හැකිය .


3
`ඔබ C # හි කේත කරන්නේ නම්, එය C # වර්ගයේ අන්වර්ථයක් වන අතර C # ක්‍රමලේඛකයින් විසින් හොඳින් දන්නා බැවින් මම නූල් වලට කැමතියි - C # පුද්ගලයෙක් .NET රාමුව නොදන්නේ කවදාද? +1 මම සිතන පරිදි සාමාන්‍යයෙන් මෙය හොඳම පිළිතුරයි, නමුත් මා සඳහන් කළ කාරණය අමුතුයි.
MyDaftQuestions

4
මම පෞද්ගලිකව "Int32" භාවිතා කිරීමට කැමැත්තෙමි, මන්ද එය වහාම අගයෙහි පරාසය පෙන්වයි. පසුකාලීන ඉහළ බිට් පද්ධතිවල ඔවුන් "int" වර්ගය වැඩි දියුණු කළාදැයි සිතා බලන්න. c හි 'int' පෙනෙන ආකාරයට "ඉලක්ක සකසනය වඩාත් කාර්යක්ෂමව වැඩ කරන පූර්ණ සංඛ්‍යා වර්ගය" ලෙස පෙනෙන අතර එය අර්ථ දැක්වෙන්නේ "අවම වශයෙන් බිට් 16 ක්" ලෙසිනි. මම එහි පුරෝකථනය කළ හැකි අනුකූලතාවයට කැමතියි, බොහොම ස්තුතියි.
නයර්ගුඩ්ස්

2
YMyDaftQuestions මම එකඟයි. .Net වර්ග භාෂාව නොදන්නා නිසාත්, වර්ගය පැහැදිලිව පෙනෙන නිසාත්, ඕනෑම භාෂාවකින් ස්වාධීනව භාවිතා කිරීම අර්ථවත් නම් (F # ගේ හෝ VB හි අනන්‍යතාවන් සියල්ලම මා දන්නවාද?).
පීටර් - මොනිකා නැවත

5
Yer නයර්ගුඩ්ස් ඒ ගැන කරදර නොවීමට හේතු දෙකක් තිබේ. එකක් නම් intදෘඩාංග නොසලකා C # භාෂා පිරිවිතරයේ බිටු 32 ක පූර්ණ සංඛ්‍යාවක් ලෙස අර්ථ දැක්වීමයි. සී #, කාලයාගේ ඇවෑමෙන් හවුල් උරුමයක් තිබියදීත්, ඇත්ත වශයෙන්ම සී නොවේ. intබිට් 64 නිඛිලයකට වෙනස් කිරීම පිරිවිතරයේ සහ භාෂාවේ කැපී පෙනෙන වෙනසක් වනු ඇත. දැනට බිට් 64 නිඛිලය longමෙන් longඑය නැවත අර්ථ දැක්වීම අවශ්‍ය වේ . කනස්සල්ලට පත් නොවීමට අනෙක් හේතුව අදාළ නොවේ, මන්ද වර්ග කිසි විටෙකත් වෙනස් නොවන නමුත් .NET යනු වියුක්තය වන අතර එය 99% ක්ම ඔබට ඒ ගැන සිතීමට අවශ්‍ය නැත. ;-)
ක්‍රේග්

5
@Craig මම කැණීම් මම එහිදී පැරණි වානිජ ක්රීඩාව ආකෘති ගොඩක් බවට නැහැ නමුත්, සියලු කාලය ගැන හිතන්න. පසුව භාවිතා Int16, Int32හා Int64යනු ගොඩක් තරමක් nondescriptive භාවිතා වඩා කේතය තවත් විනිවිද පෙනෙන short, intසහlong
Nyerguds

506

සී # හි සපයා ඇති ආකාරයේ අන්වර්ථ නාමයන් භාවිතා කිරීම පිළිබඳව මා අසා ඇති හොඳම පිළිතුර ලැබෙන්නේ ජෙෆ්රි රිච්ටර් විසින් ඔහුගේ සීඑල්ආර් වියා සී # පොතේ ය . ඔහුගේ හේතු 3 මෙන්න:

  • මම සංවර්ධකයින් රාශියක්, ව්යාකූල භාවිතා කිරීමට ද යන්න නොදැන දැකලා තියෙනවා string හෝ සංගීත ඔවුන්ගේ කේතය දී. C # නූලෙන් (යතුරු පදයක්) හරියටම System.String (FCL වර්ගයක්) වෙත සිතියම් ගත කරන බැවින්, කිසිදු වෙනසක් නොමැති අතර ඒවා භාවිතා කළ හැකිය.
  • C # හි, System.Int64 වෙත දිගු සිතියම් , නමුත් වෙනත් ක්‍රමලේඛන භාෂාවකින්, දිගු කාලයක් Int16 හෝ Int32 වෙත සිතියම් ගත කළ හැකිය . ඇත්ත වශයෙන්ම, C ++ / CLI ඇත්ත වශයෙන්ම Int32 ලෙස සලකයි . එක් භාෂාවකින් ප්‍රභව කේත කියවන කෙනෙකුට ඔහු හෝ ඇය වෙනත් ක්‍රමලේඛන භාෂාවකින් ක්‍රමලේඛනය කිරීමට පුරුදු වී සිටියේ නම් කේතයේ අභිප්‍රාය පහසුවෙන් අර්ථ දැක්විය හැකිය. ඇත්ත වශයෙන්ම, බොහෝ භාෂාවන් දිගු කාලයක් යතුරු පදයක් ලෙස සලකන්නේ නැති අතර එය භාවිතා කරන කේත සම්පාදනය නොකරයි.
  • එෆ්සීඑල් හි බොහෝ ක්‍රම තිබේ, ඒවායේ ක්‍රම නාමවල කොටසක් ලෙස ටයිප් නම් ඇත. උදාහරණයක් ලෙස, BinaryReader වර්ගය ReadBoolean , ReadInt32 , ReadSingle වැනි ක්‍රම ඉදිරිපත් කරයි , සහ System.Convert වර්ගය ToBoolean , ToInt32 , ToSingle වැනි ක්‍රම ඉදිරිපත් කරයි . පහත කේතය ලිවීම නීත්‍යානුකූල වුවත්, පාවෙන රේඛාව මට අස්වාභාවික යැයි හැඟෙන අතර රේඛාව නිවැරදි බව පැහැදිලිව පෙනෙන්නට නැත:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

එහෙයින් ඔබට එය තිබේ. මම හිතන්නේ මේ සියල්ල ඇත්තෙන්ම හොඳ කරුණු ය. කෙසේ වෙතත්, මම මගේම කේතයෙන් ජෙෆ්රිගේ උපදෙස් භාවිතා නොකරමි. සමහර විට මම මගේ සී # ලෝකයේ හිර වී ඇති නමුත් මගේ කේතය රාමු කේතය මෙන් පෙනෙන්නට උත්සාහ කරමි.


24
ඇත්තටම හේතුවක් වැනි දෙවන කරුණ ශබ්ද නොවන භාවිතා කිරීමට string, intආදිය
MauganRa

15
A මෝගන්රා පොතේ කතුවරයා අන්වර්ථ නාම භාවිතා නොකිරීමට හේතු ලැයිස්තුගත කරයි .
tomi.lee.jones

31
"යමෙකු සී # ප්‍රභව කේතය කියවන්නේ නම් ඔවුන් භාෂා පිරිවිතරයට අනුව දීර් inter අර්ථකථනය කළ යුතුය. වෙනත් භාෂා පිරිවිතරයක් නොවේ." එම කරුණ මුළුමනින්ම මග හැරේ. කේතය වැරදි ලෙස අර්ථකථනය කිරීමට කිසිවෙකු අදහස් කරන බවක් නොවේ , වෙනත් සන්දර්භයක ක්‍රමලේඛකයා දෛනිකව දකින දෙයට වඩා වෙනස් අර්ථයක් ඇති විට කෙනෙකුගේ මොළයට වැරදි නිගමනයකට එළඹීම පහසුය. අපි හැමෝම වැරදි කරනවා; පැහැදිලිව නම් කරන ලද වර්ග භාවිතා කිරීමෙන් එම වැරදි අඩු වේ.
ඩැරල්

10
+ මෙම හේතු කාරණා පිළිබඳ මගේ හැඟීම් සාරාංශ කරයි. මම මුලින්ම C # හි කේතකරණය ආරම්භ කළ විට (ජාවා / සී ++ / සී පසුබිමකින් එන) අන්වර්ථයන් කැත යැයි මම සිතුවෙමි. මට තවමත් එසේ දැනේ, අවාසනාවකට ලෝකයේ බොහෝ දෙනෙක් මා සමඟ එකඟ වන බවක් නොපෙනේ, නැතහොත් ඔවුන් එය ගණන් ගන්නේ නැත, එබැවින් කුඩා අකුරු භාවිතා කරන්න.
ගුස්ගෝර්මන්

8
in ජින්සායිගේ ප්‍රශ්නය C # ගැන වන අතර long, එය වේදිකාව හෝ සම්පාදකයා නොසලකා අත්සන් කළ 64-බිටු පූර්ණ සංඛ්‍යාවක් ලෙස අර්ථ දැක්වේ. ඒ නිසා අවම වශයෙන් සමහර අවස්ථා වලදී, ඔව්, එය කරන්නේ කෙසේද භාෂාව මත රඳා පවතී.
phoog

456

stringවෙන් කර ඇති වචනයකි, නමුත් Stringඑය පන්තියේ නමකි. මෙයින් අදහස් කරන්නේ stringඑය විචල්‍ය නාමයක් ලෙස භාවිතා කළ නොහැකි බවයි.

කිසියම් හේතුවක් නිසා ඔබට නූල් නම් විචල්‍යයක් අවශ්‍ය නම් , ඔබට පෙනෙනුයේ මෙම සම්පාදනයන්ගෙන් පළමුවැන්න පමණි:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

ඔබට සැබවින්ම string නමින් විචල්‍ය නමක් අවශ්‍ය නම් ඔබට @උපසර්ගයක් ලෙස භාවිතා කළ හැකිය :

StringBuilder @string = new StringBuilder();

තවත් තීරණාත්මක වෙනසක්: සිරස් පිටාර ගැලීම ඒවා වෙනස් ලෙස ඉස්මතු කරයි.


20
දේශීය අය ඇමතීම @stringඅර්ථ විරහිත බව මතක තබා ගන්න , මන්ද දේශීයයන්ගේ නම් ඇත්තේ PDB වල පමණි. සමහර විට එය _stringහෝ වෙනත් දෙයක් අමතන්න . @stringසාමාජිකයෙකුගේ නම විය හැකි පරාවර්තනය හරහා ප්‍රවේශ විය හැකි නම් ඇති දේ සඳහා එය වඩාත් අර්ථවත් කරයි "string".
රෝමන් ස්ටාර්කොව්

25
වෙන් කළ වචනයක් විචල්‍ය නාමයක් ලෙස භාවිතා කිරීම තරයේම නුසුදුසු බව මතක තබා ගන්න.
එල්ටන්

7
විචල්ය නාමයක් ලෙස නූල් හෝ නූල් භාවිතා කිරීමට OP කැමති නැත. මෙම වර්ග අතර වෙනස පැහැදිලි කිරීමක් ඔවුන් ඉල්ලා සිටියේය . ඔබගේ පිළිතුර තවත් ව්‍යාකූලත්වයක් එක් කිරීමට පමණක් IMO
Matt Wilko

1
racraig ඔබ ගැට ගැටගැසීමට මිනිසුන්ට ඉගැන්වීම සඳහා මෘදුකාංගයක් ලියන්නේ නම්?
සයිමන්_වීවර්

5
Im සිමොන්_වීවර් නූල්වල ගැට? හාහා, හොඳයි. :-) ඇත්ත වශයෙන්ම, ඔබට නූල් වැනි විකල්ප නමක් තෝරා ගත හැකිය. පොඩ්ඩක් ඉන්න ... ඩෝ!
ක්‍රේග්

392

එක් වෙනසක් ඇත - ඔබට කලින් Stringනොමැතිව භාවිතා කළ නොහැක using System;.


14
පෙරනිමියෙන් බොහෝ අය මෙය ඕනෑම ආකාරයකින් ගොනුවේ ඉහළින්ම එකතු කරති. VS මෙය පෙරනිමියෙන් කරන්නේ බොහෝ අවස්ථාවන්හිදී නොවේ!
IbrarMumtaz

9
පෙරනිමියෙන් මම usingඅවශ්‍ය ප්‍රකාශ පමණක් එකතු කරන අතර මා නොකරන සියල්ල පැහැදිලිවම ඉවත් කරමි. බලය ඵලදායිතා මෙවලම්> "[x] ඉතිරි මත Usings ඉවත් කරන්න සහ ආකෘතිය"
JMD

2
@JMD මම .cs අච්චු ගොනුව වෙනස් කර ඇති බැවින් එයට ඉහළින් කිසිදු ප්‍රකාශයක් නොමැත! මම පන්ති අච්චුවද වෙනස් කළෙමි internal sealed.
එරික්

@JMD මම එම අංගයට වෛර කරමි. එය සමහර විට වෙනත් ආකාරයකින් ස්පර්ශ නොකළ ලිපිගොනු වල වෙනස්කම් සිදු කරයි. ඇත්ත වශයෙන්ම මම සාමාන්‍යයෙන් "අයාචිත තැපැල් භාවිතා කිරීම" ඉවත් කරමි, නමුත් ක්‍රියාශීලීව පමණක් නොව ස්වයංක්‍රීයව නොවේ.
mg30rg

C # සඳහා එය එසේ විය හැකි නමුත් සියලුම .NET භාෂා නොවේ. (
පවර්ෂෙල්

312

එය ඉහළින් ආවරණය කර ඇත; කෙසේ වෙතත්, ඔබට stringපරාවර්තනය සඳහා භාවිතා කළ නොහැක ; ඔබ භාවිතා කළ යුතුයි String.


6
මෙම පිළිතුරේ තේරුම කුමක්ද සහ එය ඉහළට ඔසවා තැබුවේ ඇයිද යන්න මට තේරෙන්නේ නැත. ඔබට typeof(string)පරාවර්තනය සඳහා භාවිතා කළ හැකිය . උදාහරණයක් එක්: if (someMethodInfo.ReturnType == typeof(string)) { ... }උදාහරණයක් දෙකක්: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance);කොහෙද ඔබ භාවිතා කළ යුතු බව ය String, නැත string? ඔබ වැනි දේ උත්සාහ කළහොත් Type.GetType("String")හෝ Type.GetType("string")නම් අවකාශය නැති නිසා පන්තිය සොයාගත නොහැක. කිසියම් මෝඩ හේතුවක් නිසා ඔබ .Nameවර්ගයක් සංසන්දනාත්මකව "string"සංවේදී ආකාරයකට සංසන්දනය කරන්නේ නම් , ඔබ හරි ය.
ජෙප් ස්ටිග් නීල්සන්

257

System.String.NET string class - C # stringහි අන්වර්ථයකි System.String- එබැවින් භාවිතයේ දී ඒවා සමාන වේ.

මාර්ගෝපදේශ සම්බන්ධයෙන් ගත් කල, මම එතරම් ව්‍යාකූල නොවී ඔබට හැඟෙන ඕනෑම දෙයක් භාවිතා නොකරමි - ජීවිතයේ වඩා වැදගත් දේවල් ඇති අතර කේතය කෙසේ හෝ සමාන වනු ඇත.

ඔබ ගොඩ එය ඔබ භාවිතා කරන පූර්ණ සංඛ්යා ප්රමාණය නියම එසේ භාවිතය නැඹුරු කිරීමට අත්යවශ්ය වන අවස්ථාවක පද්ධති සොයා නම් Int16, Int32, UInt16, UInt32ආදිය පසුව එය භාවිතා කිරීමට වඩා ස්වාභාවික දිස් විය String- හා සමහරවිට වෙනස් .net භාෂා අතර පමණ ගමන් කරන විට දේවල් වඩාත් තේරුම් ගත හැකි පරිදි සකසන්න - එසේ නොමැතිනම් මම නූල් සහ int භාවිතා කරමි.


2
එකක් තෝරාගෙන ස්ථාවර වන්න. ඔබ ගෘහ ශෛලියක් සමඟ කොහේ හරි වැඩ කරන්නේ නම්, එය භාවිතා කරන්න.
ඇලන් බී

3
අවාසනාවට විලාසිතාව පුද්ගලික මනාපයක් වන අතර විශේෂිත කේත හිමිකරුවෙකු නොමැතිව කණ්ඩායම් කිහිපයක් හරහා විශාල කේත පදනමක් තුළ බලාත්මක කිරීමට නොහැකි තරම් මිල අධික විය හැකිය. නූල් එදිරිව නූල් වලට වඩා සැලකිලිමත් වීමට වඩා වැදගත් කරුණු සෑම විටම තිබේ. එය අපව "ජීවිතයේ වඩා වැදගත් දේ" වෙත නැවත ගෙන එයි
aiodintsov

මෙය නියත වශයෙන්ම මනාපයකි; උදාහරණයක් ලෙස: භාවිතා කිරීමට මම කැමති short, int, ushort, uintවෙනුවට Int16ආදිය, මම මේ ඉගෙන ආකාරය වේ නිසා ගීතයට. Int16අඩු පළපුරුද්දක් ඇති අයට වහාම තේරුම් ගැනීමට පහසු බව පිළිගත යුතුය. +1 මගෙන්!
කැන්ඩල්ෂාර්ක්

211

.NETආකෘතිකරණ හේතූන් මත මම ප්‍රාග්ධනීකෘත වර්ග වලට (අන්වර්ථයන්ට වඩා) කැමතියි . මෙම .NETවර්ග වෙනත් වස්තුවක් වර්ග (වර්ග සියලු පසු, නිසි වස්තූන් වන වටිනාකම) මෙන් ම වර්ණ කර ඇත.

කොන්දේසි සහිත සහ පාලන වචන (වැනි if, switchසහ return) කුඩා අකුරු සහ තද තද නිල් (පෙරනිමියෙන්) වේ. භාවිතයේ සහ ආකෘතියේ එකඟ නොවීමක් මට නැත.

සලකා බලන්න:

String someString; 
string anotherString; 

11
ඔබත් කේත ලියන්නේ: Int32 i = 1; Int i = 1 වෙනුවට; ? අන්වර්ථය ලබා ගත හැකි විට එය භාවිතා නොකිරීමට නොගැලපේ.
bytedev

29
@nashwan: ඇත්තටම, ඔව්, මම භාවිතා කරන්නේ Int32 i=1;ක intstead int i = 1; මම 32 බිට් අත්සන් පූර්ණ සංඛ්යාමය අවශ්ය එනම් බව මම හිටපු මගේ අභිප්රාය ලෙස වඩාත් හොඳින් කියවිය හැකි ක්රියාවකි.
NotMe

5
හොඳයි, මම හිතන්නේ ඒ සියල්ල රඳා පවතින්නේ සංවර්ධකයා සිතන්නේ ඔවුන් සී # කේතය (නූල්) හෝ .නෙට් කේතය (නූල්) ලියන බවයි. පුද්ගලිකව මම ප්‍රධාන වශයෙන් සිතන්නේ මම C # ලියන බවයි (එය .NET භාවිතා කරන C # වේ).
bytedev

7
Lex ඇලෙක්ස්: මගේ අදහස වූයේ අපැහැදිලි බව ඉවත් කිරීම සඳහා මගේ කේතීකරණයේ විශේෂිත වීමට මම කැමැත්තෙමි.
NotMe

22
වර්ණාවලියේ නිරපේක්ෂ අනෙක් අන්තය, මත, මම හැම විටම පාහේ පමණක් භාවිතාvar
ටික්

193

stringසහ Stringසෑම ආකාරයකින්ම සමාන වේ (ලොකු අකුර "එස්" හැර). එක් ආකාරයකින් කාර්ය සාධන ඇඟවුම් නොමැත.

stringසින්ටැක්ස් ඉස්මතු කිරීම නිසා බොහෝ ව්‍යාපෘති වල සිම්පල් වඩාත් කැමති වේ


ජෙෆ්රි රිච්ටර් නිර්දේශ කරන්නේ මෙහි සිදුවන ආකාරයේ ව්‍යාකූලතාවයන් වළක්වා ගැනීම සඳහා සීඑල්ආර් වර්ගය සෑම අවස්ථාවකම (සීඑල්ආර් හරහා සී #) භාවිතා කිරීමයි.
ජොෂ්

පැහැදිලිවම, ඔබ එස් හෝ එස් භාවිතා කළත් එය මෙම ප්‍රශ්න වලට හේතු වනු ඇත, එබැවින් අඩු ඡන්ද රිච්ටර්. ;)
බ්‍රැඩ් විල්සන්

රිච්ටර් යන්නෙන් අදහස් කළේ නූල් විකල්පයක් නොවිය යුතු බවයි - මයික්‍රොසොෆ්ට් එය භාෂාවෙන් නොතිබිය යුතුය. ඔබට රිච්ටර්ට ඡන්දය දිය නොහැක - ඔහු පුරාවෘත්තයකි! :)
ජෝ රැට්සර්

1
අන්වර්ථ නාමයන් නොතිබීම වඩා හොඳ විය හැකි බව මම එකඟ වෙමි . නමුත් අප සතුව ඒවා ඇති බැවින්, ඒවා භාවිතා කිරීම සුදුසු යැයි මම සිතමි (නමුත් ක්‍රම නාම වලින් නොවේ)
ජෝන් ස්කීට්

10
"string" යනු "String" ට සමාන නොවේ. යන්නෙහි තේරුම "System.String" යන්නයි. එබැවින් ඔබ "
නූල්

186

සී # යනු සීඑල්ආර් සමඟ එක්ව භාවිතා වන භාෂාවකි.

string C # හි වර්ගයකි.

System.String සීඑල්ආර් හි වර්ගයකි.

ඔබ C # භාවිතා කරන විට CLR stringසමඟ සිතියම් ගත වේ System.String.

න්‍යායාත්මකව, ඔබට ජාවා බයිට් කේතය ජනනය කරන C # -compiler ක්‍රියාත්මක කළ හැකිය. මෙම සම්පාදකයා බුද්ධිමත්ව ක්‍රියාත්මක කිරීම බොහෝ විට ජාවා ධාවන කාල පුස්තකාලය සමඟ අන්තර් ක්‍රියා කිරීම සඳහා සිතියම් ගත stringකරයි java.lang.String.


1
stringC # හි වර්ගයක් නොවේ ; එය සීඑල්ආර් හි වර්ගයකට සිතියම් ගත කරන වෙන් කළ වචනයකි.
සීසර්ගොන්

Es සීසර්ගොන්: ECMA-334 ට අනුව, 8.2.1 වගන්තිය: "C # මඟින් පූර්ව නිශ්චිත වර්ග සමූහයක් සපයයි [...] පූර්ව නිශ්චිත යොමු වර්ග වස්තු සහ නූල් වේ."
රස්මුස් ෆේබර්

10
ECMA-334, 9.4.3 වගන්තියට අනුව, “string” යනු ප්‍රධාන පදයකි. :-) ඔබ අර්ථ නිරූපණය කෙරෙහි අවධානය යොමු කරන්නේ නම් "නූල්" යනු වර්ගයක් බව මම ඔබ සමඟ එකඟ වෙමි, නමුත් මම කියන්නේ ඔබ වාක්‍ය ඛණ්ඩය කෙරෙහි අවධානය යොමු කරන්නේ නම් එය ප්‍රධාන පදයක් (එනම් වෙන් කළ වචනයක්) බවයි. ප්‍රමිතිය දෘෂ්ටි කෝණයන් දෙකටම පිටුබලය දෙයි (සමහර විට ඉතා අපැහැදිලි ලෙස!). මට නම්, OP යනු සින්ටැක්ස් ගැන ය, එබැවින් මම පිළිතුරු දෙස බලන විට සින්ටැක්ස් කෙරෙහි අවධානය යොමු කරමි, නමුත් ඔබේ අදහස ද මට පෙනේ. තව දුරටත්, ඔබේ පිළිතුර, පවතින ආකාරයට අර්ථ දැක්විය හැක්කේ විවිධ වර්ග දෙකක් පවතින බව ය: නූල් සහ නූල්, එසේ නොවන විට. එකක් අනෙකට සිතියම් ගත කිරීමකි.
සීසර්ගොන්

අපි මේ ගැන පැහැදිලි වෙමු. 'string' යනු වෙන් කළ අන්වර්ථයකි. එය සත්‍ය දත්ත සමුදායක් නොවේ. එය වෙනත් දෙයකට යොමු කරන දෙයක්. ඔබට මෙම අන්වර්ථ නාම සියල්ල ඉවත් කළ හැකිය (නැතහොත් ඒවා කිසි විටෙකත් භාවිතා නොකරන්න) සහ හොඳ ක්‍රමලේඛන භාෂාවක් ඇත.
ක්වාර්ක්ලි

169

මෙම යූ ටියුබ් වීඩියෝව ප්‍රායෝගිකව ඒවා වෙනස් වන ආකාරය පෙන්නුම් කරයි.

නමුත් දැන් දිගු පා answer මය පිළිතුරක් සඳහා.

අපි ගැන කතා කරන විට .NETවිවිධ දේවල් දෙකක් එක් වේ පවතී .NETරාමුව සහ වෙනත් භාෂා (ඇත C#, VB.NETබව රාමුව භාවිතා කරන ආදිය).

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

" System.String" aka "String" (ප්‍රාග්ධනය "S") යනු .NETරාමු දත්ත වර්ගයක් වන අතර "string" යනු C#දත්ත වර්ගයකි.

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

කෙටියෙන් කිවහොත් “නූල්” යනු “නූල්” හි අන්වර්ථයකි (එකම නම විවිධ නම් වලින් හැඳින්වේ). එබැවින් තාක්ෂණික වශයෙන් පහත කේත ප්‍රකාශ දෙකම එකම ප්‍රතිදානයක් ලබා දෙනු ඇත.

String s = "I am String";

හෝ

string s = "I am String";

පහත දැක්වෙන ආකාරයට වෙනත් c # දත්ත වර්ග සඳහා අන්වර්ථ නාමයන් ඇත: -

වස්තුව: System.Object, නූල්: System.String, bool: System.Boolean, බයිට: System.Byte, sbyte: System.SByteකෙටි: System.Int16හා එසේ මත

දැන් ක්‍රමලේඛකයාගේ දෘෂ්ටි කෝණයෙන් ඩොලර් මිලියනයක ප්‍රශ්නය එසේ නම් “නූල්” සහ “නූල්” භාවිතා කරන්නේ කවදාද?

ව්යාකූලත්වය වළක්වා ගත යුතු පළමු දෙය ඒවායින් එකක් නිරන්තරයෙන් භාවිතා කරන්න. නමුත් හොඳ භාවිතයන් දෙස බලන විට ඔබ විචල්‍ය ප්‍රකාශයක් කරන විට “නූල්” (කුඩා “ය”) භාවිතා කිරීම හොඳ වන අතර ඔබ එය පන්ති නාමයක් ලෙස භාවිතා කරන විට “නූල්” (ප්‍රාග්ධනය “එස්”) වඩාත් සුදුසු වේ.

පහත කේතයෙහි වම් පස විචල්‍ය ප්‍රකාශයක් වන අතර එය "නූල්" භාවිතයෙන් ප්‍රකාශයට පත් කරන ලදි. දකුණු පසින් අපි ක්‍රමයක් අමතන්නෙමු, එබැවින් "නූල්" වඩාත් සංවේදී වේ.

string s = String.ToUpper() ;

25
කෙටියෙන් කිවහොත් “නූල්” යනු “නූල්” හි අන්වර්ථයකි (එකම නම විවිධ නම් වලින් හැඳින්වේ). මෙය නිවැරදි නොවේ: අන්වර්ථය "නූල්" වේ.
සේවියර් එජියා

3
ඔබ විචල්ය ප්‍රකාශයක් කරන විට "string" (කුඩා "s") භාවිතා කිරීම හොඳ වන අතර ඔබ එය පන්ති නාමයක් ලෙස භාවිතා කරන විට "String" (ප්‍රාග්ධනය "S") වඩාත් සුදුසු වේ. මෙම සම්මුතිය තවදුරටත් වලංගු නොවන බව පෙනේ: ඔබ විෂුවල් ස්ටුඩියෝ 2015 භාවිතා කර Stringඑය ලිවීමට උත්සාහ කරන්නේ නම් එය "ඔබේ කේතය සරල කරන්න" යනුවෙන් යෝජනා කරයි, එය රැගෙන යයි string...
මැසිමිලියානෝ ක්‍රවුස්

166

පහළ නඩුව stringසඳහා අන්වර්ථයකි System.String. ඔවුන් තුළ සමාන වේ C#.

ඔබ පද්ධතිය වර්ග (භාවිතා කළ යුතු ද යන්න පිලිබඳ විවාදයක් තියෙනවා System.Int32, System.String, ආදිය) වර්ග හෝ C# aliases( int, string, ආදිය). මම පෞද්ගලිකව විශ්වාස කරන්නේ ඔබ එය භාවිතා කළ යුතු බවයි C# aliases, නමුත් එය මගේ පෞද්ගලික මනාපය පමණි.


4
ගැටලුව එයයි, ඒවා 'සී #' අන්වර්ථයන් නොවේ, ඒවා 'සී' අන්වර්ථයන් ය. සී # භාෂාවේ ස්වදේශීය 'නූල්' හෝ 'ඉන්ට' නොමැත, හුදෙක් සින්ටැක්ටික් සීනි.
ක්වාර්ක්ලි

16
C # 5 භාෂා පිරිවිතරයේ "යතුරු පද මාලාව හුදෙක් පෙර නියම කරන ලද පන්තියේ System.String සඳහා අන්වර්ථයකි." 85 වන පිටුවේ, 4.2.4 ඡේදය. සියලුම ඉහළ මට්ටමේ භාෂාවන් CPU උපදෙස් කට්ටල සහ බයිට් කේතය හරහා සින්ටැක්ටික් සීනි වේ.
aiodintsov

157

stringසඳහා අන්වර්ථයකි System.String. සම්පාදකයා ඔවුන්ට එක හා සමානව සලකනු ඇත.

එකම ප්‍රායෝගික වෙනස වන්නේ ඔබ සඳහන් කළ පරිදි සින්ටැක්ස් ඉස්මතු කිරීමයි using System, ඔබ භාවිතා කරන්නේ නම් ලිවිය යුතුය String.


String භාවිතා කිරීමට ඔබට පද්ධතියේ උපසර්ගය අවශ්‍ය නොවේ.
ජෝ රැට්සර්

18
using Systemභාවිතා කිරීමේදී ඔබ ඇතුළත් කළ යුතුය String, එසේ නොමැතිනම් ඔබට පහත දෝෂය ලැබෙනු ඇත:The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
රොනල්ඩ්

144

දෙකම එක හා සමානයි. නමුත් කේතකරණ මාර්ගෝපදේශ දෘෂ්ටිකෝණයෙන් ඒ stringවෙනුවට භාවිතා කිරීම වඩා හොඳය String. සාමාන්‍යයෙන් සංවර්ධකයින් භාවිතා කරන්නේ මෙයයි. උදා: Int32අප භාවිතා intකරන intඅන්වර්ථය ලෙස භාවිතා කරනවා වෙනුවටInt32

FYI “මූලික වචන මාලාව හුදෙක් පූර්ව නිශ්චිත පන්තියේ අන්වර්ථයකි System.String.” - සී # භාෂා පිරිවිතර 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx


121

අනෙක් අය පවසන පරිදි, ඔවුන් සමාන ය. StyleCop රීති, පෙරනිමියෙන්, ඔබ භාවිතා කිරීමට ක්රියාත්මක වනු ඇත stringසී # කේතය ශෛලිය හොඳම ක්රමවේදයක් ලෙස, පිලිබඳව සඳහන් කරන විට හැර System.Stringවැනි ස්ථිතික කටයුතු, String.Format, String.Join, String.Concatආදිය, ...


4
ස්ථිතික ක්‍රම හැර - ස්ටයිල්කොප් සංගීත භාවිතය සලකුණු කරන බව මා දැන සිටියේ නැත. මම එය සැමවිටම භාවිතා කරන ආකාරයටම එය විශිෂ්ට යැයි මම සිතමි: ස්ථිතික සාමාජිකයින්ට ප්‍රවේශ වන විට වර්ග ප්‍රකාශ සඳහා නූල් සහ නූල්.
ගොයුක්ස්

102

අවුරුදු 6 යි මාස 5 කට පසු නව පිළිතුරක් (කල් දැමීම).

අතර stringහැම විටම ස්ථාවර අර්ථය ඇති බව රක්ෂිත C # ඉඟි පද වන අතර, Stringහුදෙක් සාමාන්ය වේ හඳුනාගැනීමේ දෙයක් වෙත යොමු වන්න හැකි. වත්මන් වර්ගයේ සාමාජිකයන් මත පදනම්ව, වත්මන් නාම අවකාශය සහ ව්‍යවහාරික usingවිධානයන් සහ ඒවා ස්ථානගත කිරීම, Stringවටිනාකමක් හෝ වර්ගයක් විය හැකිය global::System.String.

usingවිධානයන් උදව් නොකරන උදාහරණ දෙකක් මම දෙන්නෙමි .


පළමුව, විට Stringයනු අගය වත්මන් වර්ගය (හෝ දේශීය විචල්ය) ක:

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

IEnumerable<>ස්ථිතික නොවන සාමාජිකයෙකු නොමැති නිසා ඉහත සඳහන් දෑ සම්පාදනය නොකෙරෙන අතර දීර් Formatextension කිරීමේ ක්‍රම අදාළ නොවේ. ඉහත අවස්ථාවෙහිදී, වර්ගයක් එකම වාක්‍ය ඛණ්ඩයක් වන Stringවෙනත් සන්දර්භයන්හි භාවිතා කිරීමට තවමත් හැකි විය හැකිය . උදාහරණයක් ලෙස හරි විය හැකිය (නාම අවකාශය සහ විධානයන් මත පදනම්ව ).String local = "Hi mum!";using

නරකම: කීම String.Concat(someSequence)බොහෝ විට ( usings මත පදනම්ව ) ලින්ක් දිගු කිරීමේ ක්‍රමයට යයි Enumerable.Concat. එය ස්ථිතික ක්‍රමයට නොයනු ඇත string.Concat.


දෙවනුව, Stringවෙනත් වර්ගයක් වන විට , වත්මන් වර්ගය තුළ කූඩු කර ඇත:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Exampleක්‍රමයේ කිසිදු ප්‍රකාශයක් සම්පාදනය නොකරයි. මෙන්න Stringසෑම විටම පියානෝ නූලක් , MyPiano.String. එහි කිසිදු සාමාජිකයෙක් ( staticහෝ නැත) නොපවතී Format(හෝ එහි මූලික පන්තියෙන් උරුම වී ඇත). වටිනාකම "Goodbye"එය බවට පරිවර්තනය කළ නොහැක.


4
මම හිතන්නේ ඩයබොලික් කෙනෙක් වෙන්න පුළුවන්: using String = System.Int32; using Int32 = System.String; ඊට පස්සෙ දෝෂ ගණන් කරන්න.
ස්ටීව්

7
මෙය නිවැරදි පිළිතුරයි. stringවේ System.String.Stringඕනෑම දෙයක් විය හැකිය.
ඩේව් කසිනෝ

එකඟ විය aveDaveCousineau - අන්වර්ථයේ කාරණය එයයි. StringSystem.String වස්තුවට සකසා නැති වෙනත් වර්ගයක් ඔබට නිර්මාණය කළ හැකිය . පරීක්ෂාකාරී වන්න: blog.paranoidcoding.com/2019/04/08/…
ක්‍රිස්ටෝපර්

"යතුරුපදයට stringC # හි සංයුක්ත අර්ථයක් ඇත. එය System.Stringමූලික ධාවන කාල එකලස් කිරීමෙහි පවතින වර්ගයයි . ධාවන කාලය මෙම වර්ගය සහජයෙන්ම අවබෝධ කර ගන්නා stringsඅතර .NET හි සංවර්ධකයින් අපේක්ෂා කරන හැකියාවන් සපයයි . එහි පැවැත්ම C # ට ඉතා වැදගත් වේ. කේත රේඛාවක් විග්‍රහ කිරීමට පවා පෙර සම්පාදකයා පිටව යනු ඇත. එබැවින්string C # කේතයේ නිරවද්‍ය, සැක සහිත අර්ථයක් ඇත. හඳුනාගැනීමට StringC # හි නිශ්චිත අර්ථයක් නැත. එය සියලු නාම විමසුම් නීති හරහා ගමන් කරන හඳුනාගැනුමකි ලෙස Widget, Studentයනාදිය… ”
ක්‍රිස්ටෝපර්



88

වෙනත් වැඩසටහන්කරුවන් අතර සාමාන්ය සිරිතකි බව පෙනේ දේ එරෙහිව, මම කැමති Stringකට stringපමණක් බව අවධාරණය කිරීමට Stringසැඳහුම වර්ගය වන අතර, ජෝන් Skeet සඳහන් පරිදි.



78

රිචර්ස් පොතෙන් මම මෙය උත්තරයට එකතු කිරීමට කැමතියි:

සී # භාෂා පිරිවිතරයේ මෙසේ සඳහන් වේ, “ශෛලියක් ලෙස, සම්පූර්ණ පද්ධති වර්ගයේ නම භාවිතා කිරීමට වඩා මූලික පදය භාවිතා කිරීමට කැමැත්තක් දක්වයි.” භාෂා පිරිවිතරයට මම එකඟ නොවෙමි; මම කැමතියි එෆ්සීඑල් වර්ගයේ නම් භාවිතා කිරීමට සහ ප්‍රාථමික වර්ගයේ නම් සම්පූර්ණයෙන්ම මග හැරීමට. ඇත්ත වශයෙන්ම, සම්පාදකයින් විසින් ප්‍රාථමික වර්ගයේ නම් පවා ලබා නොදුන් අතර ඒ වෙනුවට FCL වර්ගයේ නම් භාවිතා කිරීමට සංවර්ධකයින්ට බල කෙරුනි. මෙන්න මගේ හේතු:

  • මම සංවර්ධකයින් රාශියක්, ව්යාකූල භාවිතා කිරීමට ද යන්න නොදැන දැකලා තියෙනවා string හෝ සංගීත ඔවුන්ගේ කේතය දී. C # string (keyword) හි හරියටම System.String (FCL වර්ගයක්) වෙත සිතියම් ගත කරන බැවින්, කිසිදු වෙනසක් නොමැති අතර ඒවා භාවිතා කළ හැකිය. ඒ හා සමානව, සමහර සංවර්ධකයින් පවසන්නේ 32-බිට් මෙහෙයුම් පද්ධතියක යෙදුම ක්‍රියාත්මක වන විට int 32-bit පූර්ණ සංඛ්‍යාවක් නියෝජනය කරන බවත් යෙදුම 64-bit මෙහෙයුම් පද්ධතියක් මත ක්‍රියාත්මක වන විට එය 64-bit පූර්ණ සංඛ්‍යාවක් නියෝජනය කරන බවත්ය. මෙම ප්‍රකාශය මුළුමනින්ම අසත්‍යයකි: C # හි, int සෑම විටම System.Int32 වෙත සිතියම් ගත කරයි , එබැවින් කේතය ක්‍රියාත්මක වන මෙහෙයුම් පද්ධතිය නොසලකා එය බිටු 32 ක පූර්ණ සංඛ්‍යාවක් නිරූපණය කරයි. ක්‍රමලේඛකයින් භාවිතා කරන්නේ නම්ඔවුන්ගේ කේතයේ Int32 , එවිට මෙම විභව ව්‍යාකූලත්වය ද ඉවත් කරනු ලැබේ.

  • C # හි, System.Int64 වෙත දිගු සිතියම් , නමුත් වෙනත් ක්‍රමලේඛන භාෂාවකින්, දිගු කාලයක් Int16 හෝ Int32 වෙත සිතියම් ගත කළ හැකිය . ඇත්ත වශයෙන්ම, C ++ / පාබල සංග්රහ කරන්නේ දිගු ලෙස Int32 . එක් භාෂාවකින් ප්‍රභව කේත කියවන කෙනෙකුට ඔහු හෝ ඇය වෙනත් ක්‍රමලේඛන භාෂාවකින් ක්‍රමලේඛනය කිරීමට පුරුදු වී සිටියේ නම් කේතයේ අභිප්‍රාය පහසුවෙන් අර්ථ දැක්විය හැකිය. ඇත්ත වශයෙන්ම, බොහෝ භාෂාවන් දිගු කාලයක් යතුරු පදයක් ලෙස සලකන්නේ නැති අතර එය භාවිතා කරන කේත සම්පාදනය නොකරයි.

  • එෆ්සීඑල් හි බොහෝ ක්‍රම තිබේ, ඒවායේ ක්‍රම නාමවල කොටසක් ලෙස ටයිප් නම් ඇත. උදාහරණයක් ලෙස, BinaryReader වර්ගය ReadBoolean , ReadInt32 , ReadSingle වැනි ක්‍රම ඉදිරිපත් කරයි , සහ System.Convert වර්ගය ToBoolean , ToInt32 , ToSingle වැනි ක්‍රම ඉදිරිපත් කරයි . පහත කේතය ලිවීම නීත්‍යානුකූල වුවත්, පාවෙන රේඛාව මට අස්වාභාවික යැයි හැඟෙන අතර රේඛාව නිවැරදි බව පැහැදිලිව පෙනෙන්නට නැත:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
  • සී # භාවිතා කරන බොහෝ ක්‍රමලේඛකයින් සීඑල්ආර්ට එරෙහිව වෙනත් ක්‍රමලේඛන භාෂා භාවිතා කළ හැකි බව අමතක කිරීමට නැඹුරු වන අතර, මේ නිසා සී # -වාදයන් පන්ති පුස්තකාල කේතයට රිංගයි. උදාහරණයක් ලෙස, Microsoft හි FCL පාහේ මෙම FCL කණ්ඩායම C # හා සංවර්ධකයන් ලියා ඇත දැන් වැනි පුස්තකාල බවට ක්රම හඳුන්වා දී ඇත Array ගේ GetLongLength ක නැවත වන Int64 වූ බව අගය දිගු C # ගැන නමුත් සී වැනි වෙනත් භාෂා (දී ++ / CLI). තවත් උදාහරණයක් වන්නේ System.Linq.Enumerable ’s LongCount ක්‍රමයයි.

සම්පූර්ණ ඡේදය කියවීමට පෙර මට ඔහුගේ මතය ලැබුණේ නැත.


72

නූල් ( System.String) යනු මූලික පන්ති පුස්තකාලයේ පන්තියකි. string (සිම්පල්) යනු C # හි වෙන් කර ඇති කෘතියක් වන අතර එය System.String සඳහා අන්වර්ථයකි. Int32 vs int සමාන තත්වයකි Boolean vs. bool. මෙම C # භාෂා විශේෂිත වචන මඟින් C ට සමාන ශෛලියකින් ප්‍රාථමික ප්‍රකාශ කිරීමට ඔබට හැකි වේ.


67

Stringඑය මූල පදයක් නොවන අතර එය හදුනාගැනීමක් ලෙස භාවිතා කළ හැකි අතර එය මූලික පදයක් වන අතර එය හඳුනාගැනීමක් ලෙස භාවිතා stringකළ නොහැක. ක්‍රියාකාරී දෘෂ්ටි කෝණයෙන් දෙකම එක හා සමානයි.


67

එය සම්මුතියේ කාරණයක්, ඇත්තෙන්ම. stringසී / සී ++ විලාසිතාව වගේ. පොදු සම්මුතිය නම් ඔබ තෝරාගත් භාෂාව ලබා දී ඇති කෙටිමං භාවිතා කිරීමයි (int / Int for Int32). මෙය "වස්තුව" සඳහා ද decimalවේ.

න්‍යායාත්මකව මෙය "int" යන්නෙන් අදහස් විය හැකි අනාගත 64-බිට් ප්‍රමිතියකට කේත ගෙනයාමට උපකාරී වේ Int64, නමුත් එය එසේ නොවේ, තවද ඕනෑම යාවත්කාලීන විශාරදයක් වෙනස් වනු ඇතැයි මම අපේක්ෂා කරමිintInt32 ආරක්ෂිතව සිටීම සඳහා යොමු කිරීමක් .


66

සාදයට ප්‍රමාද වීම: මම සීඑල්ආර් වර්ග 100% ක්ම භාවිතා කරමි (හොඳයි, සී # වර්ගය භාවිතා කිරීමට බල කළහොත් හැර , නමුත් අවසන් වරට කවදාදැයි මට මතක නැත).

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

දැන් මම වසර ගණනාවක් තිස්සේ එය කර ඇති අතර, එය පුරුද්දක් වන අතර සීඑල්ආර් වර්ග සඳහා වීඑස් පෙන්වන වර්ණකයට මම කැමතියි.

එකම සැබෑ පසුබෑම වන්නේ ස්වයංක්‍රීයව C # වර්ගය භාවිතා කිරීමයි, එබැවින් මම ස්වයංක්‍රීයව ජනනය කරන ලද වර්ග නැවත ටයිප් කිරීම වෙනුවට CLR වර්ගය නියම කරමි.

එසේම, දැන්, මම "int" හෝ "string" දකින විට, එය 1970 ගණන්වල C කේතය දෙස බලන්නාක් මෙන් මට ඇත්තෙන්ම වැරදිය.


49

වෙනසක් නැත.

C # යතුරුපදය string.NET වර්ගයට සිතියම් ගත කරයිSystem.String - එය භාෂාවේ නම් කිරීමේ සම්මුතීන්ට අනුකූල වන අන්වර්ථයකි.

ඒ හා සමානව, intසිතියම් System.Int32.


බිට් 64 බිල්ඩ් එකක, ඉන්ට් සිතියම් සිස්ටම්.ඉන්ට් 64 (බයිට් 8), බිට් 32 කින් එය සිස්ටම් වෙත සිතියම් ගත කරයි. ඉන්ට 32 (බයිට් 4)
ඇලෙක්ස්

1
IntPtr සහ UIntPtr යනු වේදිකාව අනුව ප්‍රමාණය වෙනස් කරන එකම වර්ග වේ ( තථ්‍ය දර්ශක වර්ග int*සහ [U] IntPtrs හෝ සත්‍ය දර්ශකයන්ගෙන් සමන්විත වර්ග නොසලකා හැරීම ).
පී ඩැඩි

45

ඩැනියෙල් සොලිස්ගේ පොතෙන් මේ ප්‍රශ්නය පිළිබඳ උපුටා දැක්වීමක් තිබේ .

සියලුම පූර්ව නිශ්චිත වර්ග සෘජුවම යටින් පවතින .NET වර්ග වලට අනුරූපණය වේ. C # වර්ගයේ නම් (නූල්) යනු .NET වර්ග (String හෝ System.String) සඳහා අන්වර්ථ නාමයකි, එබැවින් .NET නම් භාවිතා කිරීම අධෛර්යමත් වුවද කෘතිමව ක්‍රියා කරයි. C # වැඩසටහනක් තුළ, ඔබ .NET නම් වලට වඩා C # නම් භාවිතා කළ යුතුය.


41

string යනු මූල පදයක් වන අතර, ඔබට හඳුනාගැනීමක් ලෙස string භාවිතා කළ නොහැක.

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

උදාහරණයක්

string String = "I am a string";

මූල පදය පදය පසෙකට දැමීම string සඳහා අන්වර්ථයකි System.String, දෙක හරියටම සමාන වේ.

 typeof(string) == typeof(String) == typeof(System.String)

2
එකම කුඩා වෙනස නම්, ඔබ සංගීත පන්තිය භාවිතා කරන්නේ නම්, ඔබේ ගොනුවට ඉහළින් පද්ධති නාම අවකාශය ආනයනය කළ යුතු අතර, වචන යතුරු පදය භාවිතා කිරීමේදී මෙය කළ යුතු නොවේ.
උත්තම්

සමානාත්මතා ප්‍රකාශය අසමත් වන සරල භාවිත අවස්ථා තිබේ ... බ්ලා නාම අවකාශයේ ටයිප් කෝල් එකක් නිර්වචනය කිරීම සහ සමානාත්මතා ප්‍රකාශය ක්‍රියාත්මක වන ගොනුවට එම නාම අවකාශය ආනයනය කිරීම වැනි.
රික්

40

ඔව්, ඒ හුදෙක් මෙන් ඔවුන් අතර කිසි වෙනසක් නැහැ boolහා Boolean.


40

# ජරෙඩ්පාර් (සී # සම්පාදකයාගේ සංවර්ධකයා සහ බහුල SO පරිශීලකයා!) මෙම ගැටලුව පිළිබඳව විශිෂ්ට බ්ලොග් සටහනක් ලිවීය . මම හිතන්නේ එය මෙහි බෙදා ගැනීම වටී. එය අපගේ විෂය පිළිබඳ කදිම ඉදිරිදර්ශනයකි.

stringඑදිරිව Stringවිලාසිතාවේ විවාදයක් නොවේ

[...]

යතුරුපදයට stringC # හි සංයුක්ත අර්ථයක් ඇත. එය System.Stringමූලික ධාවන කාල එකලස් කිරීමේදී පවතින වර්ගයයි . ධාවන කාලය මෙම වර්ගය සහජයෙන්ම තේරුම් ගෙන ඇති අතර .NET හි නූල් සඳහා සංවර්ධකයින් අපේක්ෂා කරන හැකියාවන් සපයයි. එහි පැවැත්ම C # ට ඉතා වැදගත් වන අතර එම වර්ගය නොපවතින විට කේත රේඛාවක් විග්‍රහ කිරීමට උත්සාහ කිරීමට පෙර සම්පාදකයා පිටව යනු ඇත. එබැවින් stringC # කේතයේ නිරවද්‍ය, සැක සහිත අර්ථයක් ඇත.

හඳුනාගැනීමට StringC # හි නිශ්චිත අර්ථයක් නොමැත. එය සියලු නාමය බැලීම නීති හරහා යයි බව හඳුනාගැනීමේ වේ Widget, Studentඑය string බැඳීමට හෝ එය තවත් එකලස් සම්පූර්ණයෙන්ම සිය අරමුණු වඩා සම්පූර්ණයෙන්ම වෙනස් විය හැකිය දී වර්ගය බැඳීමට හැකි විය, ආදිය ... string. වඩාත් නරක ලෙස එය කේතය වැනි ආකාරයකින් අර්ථ දැක්විය හැකිය String s = "hello"; දිගටම සම්පාදනය කළා.

class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}

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

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

වෙනස දෘශ්‍යමාන කිරීමට තවත් ක්‍රමයක් මෙම නියැදිය සමඟ ය:

string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code

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

[...]

Stringඑය සම්පූර්ණයෙන්ම වලංගු අරමුණු ගණනාවක් සඳහා අර්ථ දක්වා ඇති බව ඔබට පෙනෙනු ඇත: පරාවර්තන සහායකයින්, අනුක්‍රමිකකරණ පුස්තකාල, ලෙක්සර්, ප්‍රොටෝකෝල යනාදිය… මෙම ඕනෑම පුස්තකාලයකට Stringඑදිරිව. stringකේතය භාවිතා කරන ස්ථානය අනුව සැබෑ ප්‍රතිවිපාක ඇත.

එබැවින් Stringඑදිරිව එදිරිව stringවිවාදය දුටු විට මතක තබා ගන්න මෙය අර්ථ නිරූපණය ගැන මිස ශෛලිය ගැන නොවේ. නූල් තේරීම ඔබේ කේත පදනමට හොඳ අර්ථයක් ලබා දෙයි. තෝරා ගැනීම Stringවැරදියි නමුත් එය අනාගතයේදී විස්මයන් සඳහා දොර විවෘත කරයි.

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

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.