ã ãããã¡ã¢ãªå ã®æååãè¡šãããšããå§ããŸããã
B.NETæååã¯ãBSTRïŒåºæ¬æååãŸãã¯ãã€ããªæååïŒã«ãŒã«ã«åŸã£ãŠé 眮ãããŸãã æååããŒã¿ãè¡šããã®æ¹æ³ã¯ãCOMïŒå ã 䜿çšãããŠããVisualBasicããã°ã©ãã³ã°èšèªã®åºæ¬èªïŒã§äœ¿çšãããŠããŸãã C / C ++ã§ç¥ãããŠããããã«ãPWSZã¯æååãè¡šãããã«äœ¿çšãããŸããããã¯ã ã¯ã€ãæååãžã®ãã€ã³ã¿ããŒãçµç«¯ãè¡šããŸã ã ã¡ã¢ãªå ã®ãã®é åã§ã¯ãè¡ã®çµããã«ãã«çµäºæåããããããã«ããè¡ã®çµãããå€å¥ã§ããŸãã PWSZã®æååã®é·ãã¯ã空ãã¡ã¢ãªã®éã«ãã£ãŠã®ã¿å¶éãããŸãã

BSTRã¯å°ãç°ãªããŸãã

ã¡ã¢ãªå ã®æååã®BSTRè¡šçŸã®äž»ãªæ©èœïŒ
- è¡ã®é·ãã¯ã空ãã¡ã¢ãªã®å¯çšæ§ã«ãã£ãŠå¶éãããPWSZãšã¯ç°ãªããç¹å®ã®æ°ã«ãã£ãŠå¶éãããŸãã
- BSTRæååã¯åžžã«ãããã¡ã®æåã®æåãæããŸãã PWSZã¯ããããã¡ãŒå ã®ä»»æã®æåãæãããšãã§ããŸãã
- BSTRã®æ«å°Ÿã«ã¯åžžã«PWSZãšåæ§ã«åžžã«ãã«æåããããŸãããåŸè ãšã¯ç°ãªããæå¹ãªæåã§ãããæååã®ã©ãã«ã§ã衚瀺ã§ããŸãã
- æ«å°Ÿã«ãã«æåãååšãããããBSTRã¯PWSZãšäºææ§ããããŸããããã®éã¯ãããŸããã
ãã®ããã.NETã®æååã¯ãBSTRã«ãŒã«ã«åŸã£ãŠã¡ã¢ãªå ã§è¡šãããŸãã ãããã¡ãŒã«ã¯ã4ãã€ãé·ã®æååãUTF-16圢åŒã®æååã®2ãã€ãæåã2ã€ã®ãã«ãã€ãïŒ\ u0000ïŒãå«ãŸããŸãã
ãã®å®è£ ã®äœ¿çšã«ã¯ããã€ãã®å©ç¹ããããŸãïŒæååã®é·ãã¯åèšç®ããå¿ èŠããããŸãã;ããã¯ããããŒã«æ ŒçŽãããæååã¯ã©ãã«ã§ããã«æåãå«ãããšãã§ããæãéèŠãªæååã¢ãã¬ã¹ïŒåºå®ïŒã¯WCHAR *ãåé¡ãªãæåŸ ãããã¢ã³ãããŒãžã³ãŒãã«æž¡ãããšãã§ããŸãã
ããã«é²ã...
æåååãªããžã§ã¯ãã¯ã©ã®ãããã®ã¡ã¢ãªãå¿ èŠãšããŸããïŒ
æååãªããžã§ã¯ãã®ãµã€ãºãsize = 20 +ïŒlength / 2ïŒ* 4ã«çãããšæžãããèšäºã«åºäŒããŸãããããã®åŒã¯å®å šã«æ£ãããšã¯éããŸããã
ãŸããæååã¯åç §åã§ãããããæåã®4ãã€ãã«ã¯SyncBlockIndexãå«ãŸãã2çªç®ã®4ãã€ãã«ã¯åãžã®ãã€ã³ã¿ãŒãå«ãŸããŸãã
è¡ãµã€ãº= 4 + 4 + ...
äžèšã®ããã«ãæååã®é·ãã¯ãããã¡ã«æ ŒçŽãããŸã-ããã¯intåã®ãã£ãŒã«ãã§ãããããã¯ããã«4ãã€ããæå³ããŸãã
è¡ãµã€ãº= 4 + 4 + 4 + ...
æååãåè¡ã®çµããã«ããã¢ã³ãããŒãžã³ãŒãã«ïŒã³ããŒããã«ïŒãã°ãã転éããããã«ã2ãã€ããå æããnullã§çµããæåããããŸãã
è¡ãµã€ãº= 4 + 4 + 4 + 2 + ...
æååå ã®åæåã¯UTF-16ãšã³ã³ãŒãã§ããããšã«æ³šæããŠãã ãããã€ãŸãã2ãã€ããå¿ èŠã§ãã
æååãµã€ãº= 4 + 4 + 4 + 2 + 2 *é·ã= 14 + 2 *é·ã
ãã¥ã¢ã³ã¹ããã1ã€èæ ®ããç®æšãéæããŸãã ã€ãŸããCLRã®ã¡ã¢ãªãããŒãžã£ãŒã¯4ãã€ãïŒ4ã8ã12ã16ã20ã24ã...ïŒã®åæ°ã§ã¡ã¢ãªãå²ãåœãŠãŸããã€ãŸããæååã®åèšé·ã34ãã€ããå ããå Žåã36ãã€ããå²ãåœãŠãããŸãã å€ãæãè¿ã4ã®åæ°ã«äžžããå¿ èŠããããŸãããã®ããã«å¿ èŠã§ãã
æååãµã€ãº= 4 *ïŒïŒ14 + 2 *é·ã+ 3ïŒ/ 4ïŒ ïŒèªç¶åå²ã®æŽæ°ïŒ
ããŒãžã§ã³ã®åé¡ïŒããŒãžã§ã³4ããåã®.NETã§ã¯ãStringã¯ã©ã¹ã¯intåã®è¿œå ã®m_arrayLengthãã£ãŒã«ããæ ŒçŽããŸãããããã«ã¯4ãã€ããå¿ èŠã§ãã ãã®ãã£ãŒã«ãã¯ãæååã«å²ãåœãŠããããããã¡ãŒã®å®éã®é·ãã§ããã«çµäºæåãã€ãŸãé·ã+ 1ãå«ã¿ãŸãã.NET4.0ã§ã¯ããã®ãã£ãŒã«ãã¯ã¯ã©ã¹ããåé€ããããã®çµæãæåååãªããžã§ã¯ãã¯4ãã€ãå°ãªããªããŸãã
m_arrayLengthãã£ãŒã«ãããªãïŒã€ãŸãã.NET 4.0以éã§ã¯ïŒç©ºè¡ã®ãµã€ãºã¯= 4 + 4 + 4 + 2 = 14ãã€ãã§ããããã®ãã£ãŒã«ãïŒã€ãŸãã.NET 4.0ããäžïŒã§ã¯= 4 + 4 + 4 + 4 + 2 = 18ãã€ãã 4ãã€ããäžžãããšããããã16ãã€ããš20ãã€ãã«ãªããŸãã
æååæ©èœ
ããã§ãæååãã©ã®ããã«è¡šçŸãããå®éã«ã¡ã¢ãªå ã§ã©ãã ãå æãããŠãããã調ã¹ãŸããã 次ã«ããããã®æ©èœã«ã€ããŠèª¬æããŸãããã
.NETã®æååã®äž»ãªæ©èœïŒ
- ãããã¯åç §åã§ãã
- ãããã¯äžå€ã§ãã æååãäœæãããšããããå€æŽããããšã¯ã§ããªããªããŸãïŒæ£çŽãªæ¹æ³ïŒã ãã®ã¯ã©ã¹ã®åã¡ãœããåŒã³åºãã¯æ°ããè¡ãè¿ããåã®è¡ã¯ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®é€é£ã«ãªããŸãã
- ãããã¯Object.Equalsã¡ãœããããªãŒããŒã©ã€ãããŸãããã®çµæããªã³ã¯ã®å€ãæ¯èŒããã®ã§ã¯ãªããæååå ã®æåã®å€ãæ¯èŒããŸãã
åé ç®ããã詳现ã«æ€èšããŠãã ããã
æåå-åç §ã¿ã€ã
æååã¯å®éã®åç §åã§ããã€ãŸããåžžã«ããŒãã«é 眮ãããŸãã å€ãã®äººã ã¯ããããæå³ã®ããã¿ã€ããšæ··åããŸãããªããªãã圌ãã¯åãããã«æ¯ãèãããã§ããäŸãã°ãäžå€ã§ãããåç §ã§ã¯ãªãå€ã§æ¯èŒãããŸãããããã¯åç §ã¿ã€ãã§ããããšãå¿ããªãã§ãã ãã
è¡ã¯äžå€ã§ã
è¡ã¯äžå€ã§ãã ããã«ã¯çç±ããããŸãã æååã®äžå€æ§ã«ã¯å€ãã®å©ç¹ããããŸãã
- ã¹ã¬ããã¯æååã®å 容ãå€æŽã§ããªããããæåååã¯ã¹ã¬ããã»ãŒãã§ãã
- äžå€ã®æååã䜿çšãããšã1ã€ã®è¡ã®2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãä¿åããå¿ èŠããªããããã¡ã¢ãªã®è² è·ã軜æžãããŸãã ãã®å Žåãæ¯èŒãããã®ã¯ãªã³ã¯ã®ã¿ã§æžããããæ¶è²»ãããã¡ã¢ãªãå°ãªããªããæ¯èŒãé«éã«ãªããŸãã ããã.NETã§å®è£ ããã¡ã«ããºã ã¯æååã€ã³ã¿ãŒã³ïŒæååããŒã«ïŒãšåŒã°ããŸããããã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
- äžå€ã®ãã©ã¡ãŒã¿ãŒãã¡ãœããã«æž¡ãå Žåãå€æŽãããããšãå¿é ããå¿ èŠã¯ãããŸããïŒãã¡ãããrefãŸãã¯outãšããŠæž¡ãããå Žåãé€ããŸãïŒã
ããŒã¿æ§é ã¯ãäžæçãªãã®ãšæ°žç¶çãªãã®ã®2ã€ã®ã¿ã€ãã«åé¡ã§ããŸãã ãšãã§ã¡ã©ã«ã¯ãææ°ããŒãžã§ã³ã®ã¿ãä¿åããããŒã¿æ§é ã§ãã æ°žç¶ã¯ãå€æŽããããšãã«ä»¥åã®ããŒãžã§ã³ããã¹ãŠä¿æããæ§é ã§ãã åŸè ã¯å®è³ªçã«äžå€ã§ãããªããªãããããã®æäœã¯ãã®å Žã§æ§é ãå€æŽããã代ããã«åã®æ§é ã«åºã¥ããŠæ°ããæ§é ãè¿ãããã§ãã
è¡ãå€æŽãããŠããªãå Žåãæ°žç¶çã§ããå¯èœæ§ããããŸãããããã§ã¯ãããŸããã .NETã§ã¯ãæååã¯çåœã§ãã ãªã³ã¯ã§Eric LippertããŸãã«ããã§ããçç±ã«ã€ããŠè©³ããèªãããšãã§ããŸãã
æ¯èŒã®ããã«ãJavaæååã䜿çšããŸãã .NETã®ããã«äžå€ã§ãããæ°žç¶çã§ããããŸãã Javaã§ã®Stringã¯ã©ã¹ã®å®è£ ã¯æ¬¡ã®ããã«ãªããŸãã
public final class String { private final char value[]; private final int offset; private final int count; private int hash; ..... }
ã¿ã€ããžã®ãªã³ã¯ãšåæãªããžã§ã¯ããžã®ãªã³ã¯ãå«ãããªããžã§ã¯ãããããŒã®åã8ãã€ãã«å ããŠãæååã«ã¯æ¬¡ã®ãã£ãŒã«ããå«ãŸããŸãã
- charæåé åãžã®ãªã³ã¯ã
- charé åã®æååã®æåã®æåã®ã€ã³ããã¯ã¹ïŒéå§ãããªãã»ããïŒã
- 1è¡ãããã®æåæ°ã
- hashCodeïŒïŒã¡ãœããã®æåã®åŒã³åºãåŸã®èšç®ãããããã·ã¥ã³ãŒãã
ã芧ã®ãšãããJavaã®æååã¯ã.NETãããå€ãã®ã¡ã¢ãªãæ¶è²»ããŸããããã¯ãæååã«è¿œå ãã£ãŒã«ããå«ãŸãããããããããæ°žç¶åã§ããããã§ãã æ°žç¶æ§ã®ãããJavaã®String.substringïŒïŒã¡ãœããã¯OïŒ1ïŒã§å®è¡ãããŸããããã¯ããã®ã¡ãœãããOïŒnïŒã§å®è¡ããã.NETã®ããã«æååãã³ããŒããå¿ èŠããªãããã§ãã
Javaã§ã®String.substringïŒïŒã¡ãœããã®å®è£ ïŒ
public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) throw new StringIndexOutOfBoundsException(beginIndex); if (endIndex > count) throw new StringIndexOutOfBoundsException(endIndex); if (beginIndex > endIndex) throw new StringIndexOutOfBoundsException(endIndex - beginIndex); return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); } public String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; }
ããããLDNBã®ååïŒæŒé£ã¯ç¡æã§ã¯ãããŸããïŒã«ããã°ããšãªãã¯ãªãããŒãã¯ããèšã£ãŠããã®ã§ããŸãè¯ããããŸããã ãœãŒã¹æååãååã«å€§ãããã«ãããããµãæååãæ°æåã®å Žåããµãæååãžã®ãªã³ã¯ãããéããå ã®æååã®æåé åå šäœãã¡ã¢ãªã«ãã³ã°ã¢ããããŸãããŸãã¯ãæšæºã®æ¹æ³ã§åä¿¡ãããµãæååãã·ãªã¢ã«åããŠãããã¯ãŒã¯çµç±ã§è»¢éãããšãå ã®é åå šäœãã·ãªã¢ã«åãããŸããŸãããããã¯ãŒã¯ãä»ããŠéä¿¡ããããã€ãæ°ã¯å€ããªããŸãã ãããã£ãŠããã®å Žåãã³ãŒãã®ä»£ããã«
s = ss.substringïŒ3ïŒ
ã³ãŒãã䜿çšã§ããŸã
s =æ°ããæååïŒss.substringïŒ3ïŒïŒã
ãœãŒã¹æååã®æåé åãžã®åç §ã¯ä¿åãããŸããããé åã®å®éã«äœ¿çšãããéšåã®ã¿ãã³ããŒãããŸãã ãšããã§ããã®ã³ã³ã¹ãã©ã¯ã¿ãæåé åã®é·ããšçããé·ãã®æååã§åŒã³åºãããå Žåããã®å Žåã³ããŒã¯çºçããŸããããå ã®é åãžã®åç §ã䜿çšãããŸãã
Javaã®ææ°ããŒãžã§ã³ã§å€æããããã«ãæåååã®å®è£ ãå€æŽãããŸããã xonixã¯ãããææ¡ããŸããã ããã§ãã¯ã©ã¹ã«ã¯ãªãã»ãããã£ãŒã«ããšé·ããã£ãŒã«ãããªããªããæ°ããhash32ãïŒç°ãªãããã·ã¥ã¢ã«ãŽãªãºã ã§ïŒç»å ŽããŸããã ããã¯ãè¡ãæ°žç¶çã§ã¯ãªããªã£ãããšãæå³ããŸãã ããã§ãString.substringã¡ãœããã¯æ¯åæ°ããè¡ãäœæããŸãã
æååã¯Object.EqualsããªãŒããŒã©ã€ãããŸã
Stringã¯ã©ã¹ã¯Object.Equalsã¡ãœããããªãŒããŒã©ã€ãããåç §ã§ã¯ãªãå€ã«ããæ¯èŒãè¡ããŸãã ==ã䜿çšããŠæååãæ¯èŒããã³ãŒãã¯ãã¡ãœãããåŒã³åºãããããšã¬ã¬ã³ãã«èŠããã®ã§ãéçºè ã¯==æŒç®åããªãŒããŒã©ã€ãããŠStringã¯ã©ã¹ã®äœæè ã«æè¬ããŠãããšæããŸãã
if (s1 == s2)
æ¯èŒããŠ
if (s1.Equals(s2))
ãšããã§ãJavaã§ã¯ã==æŒç®åã¯åç §ã«ãã£ãŠæ¯èŒãããŸããæåããšã«æååãæ¯èŒããã«ã¯ãstring.equalsïŒïŒã¡ãœããã䜿çšããå¿ èŠããããŸãã
ã¹ããªã³ã°ã€ã³ã¿ãŒã³
ããŠããããŠæåŸã«ãã¹ããªã³ã°ã€ã³ã¿ãŒã³ã«ã€ããŠè©±ããŸãããã
æååãå転ããã³ãŒãã®ç°¡åãªäŸãèããŠã¿ãŸãããã
var s = "Strings are immutuble"; int length = s.Length; for (int i = 0; i < length / 2; i++) { var c = s[i]; s[i] = s[length - i - 1]; s[length - i - 1] = c; }
æããã«ããã®ã³ãŒãã¯äžç·ã«ã³ã³ãã€ã«ãããŸããã è¡ã®å 容ãå€æŽããããšããŠãããããã³ã³ãã€ã©ã¯ãããã®è¡ãèªããŸãã å®éãStringã¯ã©ã¹ã®ã¡ãœããã¯ãå 容ãå€æŽãã代ããã«ãæååã®æ°ããã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã
å®éãè¡ã¯å€æŽã§ããŸããããã®ããã«ã¯å®å šã§ãªãã³ãŒãã«é Œããªããã°ãªããŸããã äŸãèããŠã¿ãŸãããïŒ
var s = "Strings are immutable"; int length = s.Length; unsafe { fixed (char* c = s) { for (int i = 0; i < length / 2; i++) { var temp = c[i]; c[i] = c[length - i - 1]; c[length - i - 1] = temp; } } }
ãã®ã³ãŒããå®è¡ãããšãäºæ³ã©ãããè¡ã«ã¯elbatummi era sgnirtSãå«ãŸããŸã ã
æååããŸã å€æŽå¯èœã§ãããšããäºå®ã¯ã1ã€ã®éåžžã«èå³æ·±ãäºä»¶ã«ã€ãªãããŸãã æååã€ã³ã¿ãŒã³ã«é¢é£ä»ããããŠããŸãã
æååã€ã³ã¿ãŒã³ã¯ãåäžã®ãªãã©ã«ãã¡ã¢ãªå ã®1ã€ã®ãªããžã§ã¯ããè¡šãã¡ã«ããºã ã§ãã
詳现ã«æ·±ãå ¥ã蟌ãŸãªãå Žåãæååã€ã³ã¿ãŒã³ã®æå³ã¯æ¬¡ã®ãšããã§ãïŒããã»ã¹ïŒã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³ã§ã¯ãªãããã»ã¹ïŒå ã«ã¯ã1ã€ã®å éšããã·ã¥ããŒãã«ãããããã®ããŒã¯æååã§ãããå€ã¯ããããžã®åç §ã§ãã JITã®ã³ã³ãã€ã«äžã«ããªãã©ã«è¡ãããŒãã«ã«é çªã«å ¥åãããŸãïŒããŒãã«ã®åè¡ã¯1åã ãçºçããŸãïŒã å®è¡æã«ããªãã©ã«æååãžã®åç §ããã®ããŒãã«ããå²ãåœãŠãããŸãã String.Internã¡ãœããã䜿çšããŠãå®è¡æã«å éšããŒãã«ã«è¡ãé 眮ã§ããŸãã String.IsInternedã¡ãœããã䜿çšããŠãè¡ãå éšããŒãã«ã«å«ãŸããŠãããã©ããã確èªããããšãã§ããŸãã
var s1 = "habrahabr"; var s2 = "habrahabr"; var s3 = "habra" + "habr"; Console.WriteLine(object.ReferenceEquals(s1, s2));//true Console.WriteLine(object.ReferenceEquals(s1, s3));//true
ããã©ã«ãã§ã¯ãæååãªãã©ã«ã®ã¿ãã€ã³ã¿ãŒã³ããããšã«æ³šæããããšãéèŠã§ãã å éšããã·ã¥ããŒãã«ã¯ã€ã³ã¿ãŒã³ã¡ã³ãã®å®è£ ã«äœ¿çšããããããJITã³ã³ãã€ã«äžã«æ€çŽ¢ãããŸãããæéãããããŸãããããã£ãŠããã¹ãŠã®è¡ãã€ã³ã¿ãŒã³ããããšããã¹ãŠã®æé©åãç¡å¹ã«ãªããŸãã ILã³ãŒããžã®ã³ã³ãã€ã«äžã«ãã³ã³ãã€ã©ãŒã¯ãã¹ãŠã®ãªãã©ã«æååãé£çµããŸããããããéšåã«å«ããå¿ èŠããªãããã2çªç®ã®çåŒã¯trueãè¿ããŸãã ã ãããäºä»¶ã¯äœã§ããã 次ã®ã³ãŒããæ€èšããŠãã ããã
var s = "Strings are immutable"; int length = s.Length; unsafe { fixed (char* c = s) { for (int i = 0; i < length / 2; i++) { var temp = c[i]; c[i] = c[length - i - 1]; c[length - i - 1] = temp; } } } Console.WriteLine("Strings are immutable");
ããã§ã¯ãã¹ãŠãæããã§ããããã®ãããªã³ãŒãã¯æååãåºåããå¿ èŠãããããšã¯äžå€ã§ãã ãããããããïŒ ã³ãŒãã¯elbatummi era sgnirtSãåºåããŸãã ããã¯æçãã®ãã®ã§ãããæååsãå€æŽãããã®å 容ãå€æŽããŸããããã¯ãªãã©ã«ãªã®ã§ãã€ã³ã¿ãŒã³ããæååã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠè¡šç€ºãããŸãã
ç¹å¥ãªCompilationRelaxationsAttributeå±æ§ãã¢ã»ã³ããªã«é©çšããããšã«ãããæååã€ã³ã¿ãŒã³ãåé¿ã§ããŸãã CompilationRelaxationsAttributeå±æ§ã¯ãCLR JITã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã³ãŒãã®ç²ŸåºŠãå¶åŸ¡ããŸãã ãã®å±æ§ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãçŸåšCompilationRelaxations.NoStringInterningã®ã¿ãå«ãã§ããCompilationRelaxationsåæãåãå ¥ããŸããããã¯ãã¢ã»ã³ããªã匷å¶å容ãå¿ èŠãšããªããã®ãšããŠããŒã¯ããŸãã
ãšããã§ããã®å±æ§ã¯.NET FrameworkããŒãžã§ã³1.0ã§ã¯åŠçãããŸããããããã£ãŠãããã©ã«ãã§æçãç¡å¹ã«ããããšã¯ã§ããŸããã§ããã 2çªç®ã®ããŒãžã§ã³ããå§ãŸãmscorlibã¢ã»ã³ããªã¯ããã®å±æ§ã§ããŒã¯ãããŠããŸãã
å®å šã§ãªãã³ãŒãã䜿çšããŠãæ¬åœã«å¿ èŠãªå Žåã.NETã®æååãå€æŽã§ããããšãããããŸãã
å®å šã§ãªããšã©ããªããŸããïŒ
ãªãã¬ã¯ã·ã§ã³ã¡ã«ããºã ã䜿çšããŠãå®å šã§ãªãã³ãŒãã«é Œããã«æååã®å 容ãå€æŽããããšãå¯èœã§ããããšãããããŸããã ãã®ããªãã¯ã¯.NETã§ããŒãžã§ã³2.0ãŸã§å«ãŸããŠããå¯èœæ§ããããStringã¯ã©ã¹ã®éçºè ã¯ãã®ãããªæ©äŒã奪ããŸããã
.NET 2.0ã§ã¯ãStringã¯ã©ã¹ã«2ã€ã®å éšã¡ãœããããããŸããSetCharã¯ç¯å²å€ã«åºãã®ããã§ãã¯ãã InternalSetCharNoBoundsCheckã¯ç¯å²å€ã«åºãã®ããã§ãã¯ãããæå®ãããæåãç¹å®ã®ã€ã³ããã¯ã¹ã«èšå®ããŸãã å®è£ ã¯æ¬¡ã®ãšããã§ãã
internal unsafe void SetChar(int index, char value) { if ((uint)index >= (uint)this.Length) throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index")); fixed (char* chPtr = &this.m_firstChar) chPtr[index] = value; } internal unsafe void InternalSetCharNoBoundsCheck (int index, char value) { fixed (char* chPtr = &this.m_firstChar) chPtr[index] = value; }
ãããã£ãŠã次ã®ã³ãŒãã䜿çšãããšãå®å šã§ãªãã³ãŒãã䜿çšããªããŠãæååã®å 容ãå€æŽã§ããŸãã
var s = "Strings are immutable"; int length = s.Length; var method = typeof(string).GetMethod("InternalSetCharNoBoundsCheck", BindingFlags.Instance | BindingFlags.NonPublic); for (int i = 0; i < length / 2; i++) { var temp = s[i]; method.Invoke(s, new object[] { i, s[length - i - 1] }); method.Invoke(s, new object[] { length - i - 1, temp }); } Console.WriteLine("Strings are immutable");
ãã®ã³ãŒãã¯ãäºæ³ã©ããã elbatummi era sgnirtSãåºåããŸãã
ããŒãžã§ã³ã«é¢ãã質åïŒ .NET Frameworkã®ç°ãªãããŒãžã§ã³ã§ã¯ãstring.Emptyãã€ã³ã¿ãŒã³ããå Žåãšããªãå ŽåããããŸãã
ã³ãŒããèæ ®ããŠãã ããïŒ
string str1 = String.Empty; StringBuilder sb = new StringBuilder().Append(String.Empty); string str2 = String.Intern(sb.ToString()); if (object.ReferenceEquals(str1, str2)) Console.WriteLine("Equal"); else Console.WriteLine("Not Equal");
.NET Framework 1.0ã.NET Framework 1.1ãããã³.NET Framework 3.5 SP1ã§ã¯ãstr1ãšstr2ã¯åãã§ãã .NET Framework 2.0 Service Pack 1ïŒSP1ïŒããã³.NET Framework 3.0ã§ã¯ãstr1ãšstr2ã¯çãããããŸããã çŸåšãstring.Emptyã¯ã€ã³ã¿ãŒã³ã§ãã
ããã©ãŒãã³ã¹æ©èœ
æçã«ã¯ãã€ãã¹ã®å¯äœçšããããŸãã å®éã«ã¯ãCLRã«ãã£ãŠä¿åãããã€ã³ã¿ãŒã³ãããStringãªããžã§ã¯ããžã®åç §ã¯ãã¢ããªã±ãŒã·ã§ã³ãçµäºããåŸãããã«ã¯ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³ã§ãä¿æãããŸãã ãããã£ãŠã倧ããªãªãã©ã«æååã¯äœ¿çšããªãã§ãã ããããŸãã¯ãInternationRelaxationså±æ§ãã¢ã»ã³ããªã«é©çšããŠãæçãç¡å¹ã«ããå¿ èŠãããå ŽåããããŸãã
ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ã...