62 Soru: String ve C # 'daki string arasındaki fark nedir?

tarafından oluşturulan soru Wed, Jun 27, 2018 12:00 AM

Örnek ( davayı not edin ):

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

Her birinin kullanımı için gu nedir? Ve farklar nedir?

    
6002
  1. @ ORMapper, ancak string'un C # gramerinin leksik bir yapısı olduğu gerçeği, System.String ise sadece bir tip. Herhangi bir spesifikasyonda belirtilen herhangi bir açık farktan bağımsız olarak, yine de bir belirsizlikle karşılanabilecek bu örtülü fark var. Dilin string'u desteklemesi, uygulamanın BCL'deki belirli bir sınıf için dikkate alma zorunluluğu getirmeyecek şekilde desteklenmesi gerekir.
    2014-12-02 03: 05: 22Z
  2. @ KirkWoll: Dil belirtimine göre, dilin kendisi , string'u BCL türü System.String ile tamamen aynı, başka bir şey olarak düşünmemelidir. . Bu kesinlikle belirsiz değil. Elbette, C # dilbilgisini kullanarak kendi derleyicinizi uygulayabilir ve C # dili belirtiminde tanımlananlarla ilgisiz, rastgele bir şey için bulunan tüm belirteçleri kullanabilirsiniz. Ancak, sonuçta ortaya çıkan dil sadece bir C # görünüşü olurdu, C # olarak kabul edilemezdi.
    2014-12-02 08: 22: 33Z
  3. string'u, Sistem yönergesi kullanmadan kullanabilirsiniz. Bunu String ile yapamazsınız.
    2015-11-30 08: 52: 40Z
  4. Algol ve Fortran'dan gelen biri için bu tartışma string'da bir sorun olduğunu gösteriyor. System.String'u kısaltmak gerekiyor, ancak bir takma ad olarak oldukça benziyor ama aynı şey değil. Birkaç yıl sonra C #, ancak, string ve string.Format()'u kullanmak ve System.String'u merak etmemek güvenlidir.
    2016-12-20 00: 24: 25Z
  5. @ Sangeeta Ne diyorsunuz? System.String sınıfı hala orada ve string anahtar sözcüğü bunun için hala bir takma ad. Tıpkı System.Int32 ve int gibi. Kelimenin tam anlamıyla aynı şeyler.
    2018-12-08 02: 14: 44Z
30 Yanıtlar                              30                         

string , C # adında bir takma addır System.String için. Yani teknik olarak, hiçbir fark yoktur. int vs. System.Int32 gibi.

Kurallara gelince, genellikle bir nesneye atıfta bulunduğunuzda string kullanmanız önerilir.

örn.

 
string place = "world";

Aynı şekilde, özellikle de sınıfa başvurmanız gerekiyorsa, String kullanmanız önerilir.

örn.

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

Bu, Microsoft’un 'de kullanma eğiliminde olduğu stildir. onların örnekleri .

Bu alandaki rehberliğin, StyleCop şu anda değiştirilebileceği anlaşılıyor; takma.

    
5639
2019-01-22 18: 50: 42Z
  1. StyleCop'u kullanmaya karar verirseniz ve bunu takip ederseniz, dile özgü türleri kullanmanız gerekir. Yani C # için string (String yerine), int (Int32 yerine), float (Single yerine) - stylecop.soyuz5.com/SA1121.html
    2012-05-22 22: 36: 15Z
  2. Her zaman takma adları kullanırım, çünkü bir gün kullanışlı olabileceğini düşündüm çünkü bir soyutlama görevi görüyorlardı, bu yüzden uygulamaları bilmeden değiştirebilirler.
    2012-10-12 23: 25: 39Z
  3. Visual Studio 2015, String.Format'ın string.Format olarak değiştirilmesi gerektiğini söylüyor, sanırım Microsoft bu şekilde gidiyor. Ayrıca her zaman String'i statik yöntemler için kullandım.
    2014-12-22 05: 21: 27Z
  4. Bunları okuduğum gibi yorumların birçoğunun yanlış olduğunu fark ettim. @ DRAirey1 Zamanında, eski yolun hala en iyisi olduğunu göreceksiniz, şüpheliyseniz Visual Studio'yu kullanmadan C # kodu yazmaya çalışın. Web geliştirme çalışmalarında zaman zaman ortaya çıkan bir durum neredeyse imkansız. @Vlad String'i kullanmak için hiçbir şey almanıza gerek yoktur. @Abhi Yorumunuz string.Format() için anlamsız ve eşit derecede doğrudur. @KlitosG Hayır, bu doğru değil. Hepsi tam olarak aynı şekilde çalışıyor.
    2015-05-29 14: 30: 54Z
  5. Aslında, bir fark olduğuna dair bir açıklama ekleyebilir misiniz? Örneğin: nameof(string) derlenmeyecek, nameof(String) ise derlenmeyecek.
    2016-02-05 20: 38: 26Z

Sadece bütünlük uğruna, işte bunlarla ilgili bir bilgi dökümü ...

Diğerlerinin de belirttiği gibi, string, System.String için bir takma addır. Aynı kodu derlerler, bu nedenle yürütme sırasında hiçbir fark yoktur. Bu, C # 'daki diğer adlardan sadece bir tanesidir. Tam liste:

 
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 ve object dışında, diğer adların tümü değer türlerine göredir. decimal bir değer türüdür, ancak CLR'deki ilkel bir tür değildir. Takma adı olmayan tek ilkel tür System.IntPtr'dur.

Spesifikasyonda, değer tipi diğer adı "basit türler" olarak bilinir. Değişmezler, her basit tipteki sabit değerler için kullanılabilir; Başka hiçbir değer türünün gerçek formları yoktur. (Bunu DateTime değişmeze izin veren ve bunun için bir diğer adı olan VB ile karşılaştırın.)

Takma adı kullanmak için sahip olduğunuz bir durum vardır: açıkça bir enum'un temel türünü belirlerken. Örneğin:

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

Bu, sadece şartnamenin enum bildirimlerini tanımlama şekli meselesidir - kolondan sonraki kısım, sbyte, byte, short, ushort'dan bir belirteç olan integral tip olmalı, int, uint, long, ulong, char ... örneğin, değişken bildirimleri tarafından kullanılan bir türü üretimine karşılık. Başka bir fark göstermiyor.

Son olarak, kullanılacak olan konuya gelince: şahsen uygulama için takma adları her yerde kullanırım, ancak herhangi bir API için CLR türünü kullanırım. Uygulama açısından kullandığınız çok fazla önemli değil - ekibiniz arasındaki tutarlılık güzel, ama başka hiç kimse umursamıyor. Öte yandan, bir API'deki bir türden bahsederseniz, bunu tarafsız bir dilde yapmanız gerçekten önemlidir. ReadInt32 olarak adlandırılan bir yöntem açıktır, ReadInt olarak adlandırılan bir yöntem ise yorum gerektirir. Arayan, örneğin int için Int16 diğer adını tanımlayan bir dili kullanıyor olabilir. .NET framework tasarımcıları bu modeli izlediler, BitConverter, BinaryReader ve Convert sınıflarında iyi örnekler.

    
3253
2018-01-20 14: 02: 12Z
  1. Enum ile miras durumu ilginçtir. Numaralandırmanın neden numaralandırma için kullanılması gerektiğine dair belgelere işaret edebilir misiniz? Yoksa bu bilinen bir hata mı?
    2008-10-19 02: 00: 57Z
  2. Spesifikasyonun 14.1 bölümünde yer alıyor (Burada çok uzun olduğu için kolayca alıntı yapamıyorum). Açıkça takma adı kullanmanız gerektiğini söylemiyor, ancak takma adlar kendi türleri olarak ele alınan tür . Her şey biraz garip.
    2008-10-19 06: 34: 02Z
  3. @ PiPeep, fazla miktarda oy alanından daha şaşırtıcı olanı sta'dır.düşük miktarlarda aşağı oy verme (ilk 5 mesajın toplamda 2000'den fazla oy hakkı olduğunu, ancak bunların hepsinde sadece 1 oy aldığını düşünün). Özellikle, herhangi bir toplulukta her zaman "nefret" olduğu fikrini hesaba katarsanız, bunu gerçekten inanılmaz buluyorum.
    2011-09-09 21: 27: 44Z
  4. string ve String arasındaki ilginç bir fark, string' is a keyword in c#, so you can not use it as a variable name.For Ex: string string = "hi"; //compiler error, but String String = "hi"; `kabul edilebilir; String anahtar kelime değil bir tanımlayıcıdır.
    2013-06-05 07: 09: 27Z
  5. @ SanjeevRai: Evet. Ancak @string olarak biten bir tanımlayıcı oluşturmak için string kullanabilirsiniz. Bir çeşit kaçış mekanizması.
    2013-06-05 07: 18: 18Z

String, System.String anlamına gelir ve bir .NET Framework türüdür. string için C # dilinde System.String takma addır . Her ikisi de, IL’de System.String’a (Orta Dil) eklenir, bu nedenle hiçbir fark yoktur. Neyi sevdiğinizi seçin ve kullanın. C # kodlarsanız, string'u C # tipi takma adı olarak tercih ederim ve C # programcıları tarafından iyi bilinir.

(int, System.Int32) vb. hakkında aynı şeyi söyleyebilirim.

    
662
2011-12-03 19: 53: 11Z
  1. `Eğer C # kodunu yazarsanız, C # türünün takma adı olduğundan ve C # programcılarının iyi bildiği bir dize tercih ederdim - ne zaman bir C # kişi bilmez .NET çerçevesi. Genel olarak bunun en iyi cevap olduğunu düşündüğüm gibi +1, ancak bahsettiğim nokta garip görünüyor.
    2015-11-16 08: 31: 12Z
  2. Kişisel olarak "Int32" yi kullanmayı tercih ederim, çünkü hemen değerin aralığını gösterir. Daha yüksek bit sistemlerde "int" türünü yükselttiklerini hayal edin. görünüşe göre 'int' görünüşte "hedef işlemcinin en verimli çalıştığı tamsayı tipi" olarak ve "en az 16 bit" olarak tanımlandı. Orada öngörülebilir tutarlılığı tercih ederim, çok teşekkür ederim.
    2016-04-28 11: 41: 38Z
  3. @ MyDaftQuestions. Eğer herhangi bir dilden bağımsız bir şekilde .net türlerini kullanmanız mantıklı olacaktır. dil bilmezler ve tür açıktır, herhangi bir dilden bağımsız olarak (F # 'nın veya VB'nin tüm özniteliklerinin hepsini biliyor muyum?). div>
    2017-01-21 17: 39: 59Z
  4. @ Nyerguds Endişelenmemenin iki nedeni var. Birincisi, int'un, C # dil belirtiminde, donanıma bakmaksızın 32 bit bir tamsayı olarak tanımlanmasıdır. C #, zaman sisi içindeki ortak bir mirasa rağmen, aslında C değildir. int'u 64 bit bir tamsayıya değiştirmek, şartnamede ve dilde şaşırtıcı bir değişiklik olacaktır. Ayrıca long'un 643 tam sayı olması nedeniyle long'un yeniden tanımlanması gerekir. Endişelenmemenin diğer nedeni, türler asla değişmeyeceği için alakasızdır, ancak .NET, zamanın% 99'unu yine de düşünmek zorunda kalmayacak kadar soyut. ; -)
    2018-12-08 02: 47: 06Z
  5. @ Craig yaptığım her zaman bunun hakkında düşünmek zorunda kaldığım birçok eski özel oyun formatını araştırıyorum. Ve sonra Int16, Int32 ve Int64'u kullanmak, kodda tanımlayıcı olmayan short, int ve long
    'dan ziyade kodda çok daha şeffaftır.
    2018-12-09 02: 29: 47Z

C # 'da verilen tür diğer adını kullanma konusunda duyduğum en iyi cevap CLR Via C # . İşte onun 3 nedeni:

  
  • stri kullanıp kullanmayacağımı bilmeden bazı geliştiricilerin kafasının karıştığını gördüm.ng veya kodlarında Dize . C # 'da dize (anahtar kelime) tam olarak System.String (bir FCL tipi) ile eşleştiğinden, hiçbir fark yoktur ve her ikisi de kullanılabilir.
  •   
  • C # 'da, uzun , System.Int64 ile eşleşir, ancak farklı bir programlama dilinde, uzun bir Int16 ile eşlenebilir veya Int32 . Aslında, C ++ /CLI aslında bir Int32 olduğu sürece böyle davranır. Kaynak kodu bir dilde okuyan biri, farklı bir programlama dilinde programlamaya alışmışsa, kodun amacını kolayca yanlış yorumlayabilir. Aslında, çoğu dil uzun bir anahtar kelime olarak bile işlemez ve onu kullanan kodu derlemez.
  •   
  • FCL, yöntem adlarının bir parçası olarak tür adlarına sahip birçok yönteme sahiptir. Örneğin, BinaryReader türü, ReadBoolean , ReadInt32 , ReadSingle , vb. Gibi yöntemler sunar. System.Convert türü, ToBoolean , ToInt32 , ToSingle vb. yöntemler sunar. Aşağıdaki kodu yazmak yasal olsa da, kayan nokta içeren satır bana çok doğal geliyor ve satırın doğru olduğu açık değil:
  •   
 
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Öyleyse işte orada. Bunların hepsi gerçekten iyi noktalar olduğunu düşünüyorum. Ancak, kendimi Jeffrey'nin tavsiyelerini kendi kodumda kullanırken bulmuyorum. Belki de C # dünyamın içinde sıkıştım ama kodumu çerçeve koduna benzetmeye çalışıyorum.

    
470
2018-07-04 11: 05: 58Z
  1. İkinci nokta aslında değil string, int vb.
    2015-06-15 15: 37: 29Z
  2. @ MauganRa Kitabın yazarı, neden kullanılmamasına ilişkin nedenleri listeler. takma adları.
    2015-09-15 17: 48: 00Z
  3. "Eğer birisi C # kaynak kodunu okuyorsa, başka bir dilde değil, spesifik diline göre uzun yorum yapmalıdır." Bu tamamen noktayı özlüyor. Bir kimsenin kodu yanlış yorumlaması niyetinde değildir, bir türün programcının başka bir bağlamda günlük olarak gördüklerinden farklı bir anlamı olduğunda kişinin beyninin yanlış sonuca atlaması kolaydır. Hepimiz hata yaparız; açıkça adlandırılmış türlerin kullanılması, bu hataları daha az olası kılar.
    2015-09-21 22: 11: 04Z
  4. + Bu nedenler konuyla ilgili hislerimi özetliyor. C # kodlamasına ilk başladığımda (Java /C ++ /C arka planından geliyor) Takma adın çirkin olduğunu düşündüm. Hala öyle hissediyorum, maalesef dünyanın çoğu benimle aynı fikirde görünmüyor veya umursamıyorlar ve küçük harfleri kullanıyorlar.
    2017-03-02 10: 41: 21Z
  5. @ jinzai, platformda veya derleyiciden bağımsız olarak, long'un imzalı bir 64 bit tam sayı olarak tanımlandığı C # ile ilgilidir. Bu yüzden bazı durumlarda en azından evet, bu dile bağlıdır.
    2018-02-08 14: 30: 36Z

string ayrılmış bir kelimedir, ancak String yalnızca bir sınıf adıdır. Bu, string'un değişken adı olarak tek başına kullanılamayacağı anlamına gelir.

Bazı nedenlerden dolayı string adlı bir değişken istiyorsanız, bu derlemelerin yalnızca ilkini görürsünüz:

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

Gerçekten string adlı değişken bir ad istiyorsanız, önek olarak @ kullanabilirsiniz:

 
StringBuilder @string = new StringBuilder();

Bir başka kritik fark: Yığın Taşması onları farklı şekilde vurgular.

    
424
2017-12-27 17: 33: 19Z
  1. Yerel bir @string'u aramanın gerçekten anlamsız olduğunu unutmayın, çünkü yerel adlar yalnızca PDB'lerde bulunur. _string gibi bir şey de olabilir. Adlarıyla erişilebilen adlara sahip şeyler için daha anlamlı olur.@string üyesinin isminin "string" olacağı flection.
    2013-08-19 10: 30: 07Z
  2. Ayrıca, değişken bir isim olarak fena halde tutamadığı için, ayrılmış bir sözcüğü kullanmayı da unutmayın.
    2015-10-27 15: 16: 54Z
  3. "yığın taşması onları farklı şekilde vurgular". Başka neden gerek yok :)
    2016-04-22 13: 46: 26Z
  4. OP, Dize veya dizgiyi değişken adı olarak kullanmak istemiyor. Bu Tipler arasındaki farkın açıklamasını istediler. Cevabınız yalnızca daha fazla karışıklık eklemeye yardımcı oluyor IMO
    2016-07-04 15: 14: 19Z
  5. @ Simon_Weaver dizelerinde düğüm var mı? Haha güzel. :-) Elbette, thread gibi alternatif bir isim seçebilirsiniz. Bir dakika bekle ... Vay canına!
    2018-12-09 03: 59: 54Z

Bir fark var - önceden String olmadan using System; kullanamazsınız.

    
365
2016-10-03 18: 32: 52Z
  1. varsayılan olarak çoğu kişi bunu dosyanın üstüne herhangi bir şekilde ekler. VS bunu çoğu durumda değil, varsayılan olarak yapar!
    2010-04-06 16: 10: 21Z
  2. Varsayılan olarak, ihtiyacım olan yalnızca using ifade ekliyorum ve açıkça istemediğim her şeyi kaldırıyorum. Güç Verimliliği Araçları > "[x] Kaydetmedeki Kullanımları Kaldırma ve Biçimlendirme"
    2016-05-18 16: 58: 27Z
  3. @ JMD .cs şablon dosyasını değiştirdim, böylece en üstte hiç kullanma ifadesi bile yok! Ayrıca sınıf şablonunu internal sealed olarak değiştirdim.
    2016-12-01 23: 48: 35Z
  4. @ JMD Bu özellikten nefret ediyorum. Bazen el değmemiş dosyalar üzerinde değişiklik yaparak bir değişiklik setinin hangi gerçek değişiklikleri içerdiğini görmeyi zorlaştırır. Elbette, "spam kullanarak" genellikle kaldırırım, ancak yalnızca aktif olarak, otomatik olarak değil.
    2019-02-19 14: 45: 10Z
  5. Bu C # için olabilir, ancak tüm .NET dilleri için olmayabilir. (Powershell, Sistem ad alanını varsayılan olarak alır.)
    2019-03-19 23: 29: 30Z

Yukarıda ele alındı; ancak, string'u yansıma olarak kullanamazsınız; String kullanmanız gerekir.

    
293
2011-11-19 09: 36: 59Z
  1. Bu cevabın ne anlama geldiğini ve neden reddedildiğini anlamıyorum. typeof(string)'u yansıma olarak kullanabilirsiniz. Örnek bir: if (someMethodInfo.ReturnType == typeof(string)) { ... } Örnek iki: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance); String'u değil, string'u nerede kullanmanız gerekir? Type.GetType("String") veya Type.GetType("string") gibi şeyler denerseniz, sınıf alanı da bulunmaz çünkü sınıf alanı da bulunmaz. Bazı aptal bir nedenden dolayı, .Name ile "string" ile küçük harfe duyarlı bir şekilde karşılaştırırsanız haklısınız.
    2019-05-24 12: 04: 17Z

System.String, .NET string sınıfıdır - C # string, System.String için bir diğer addır - kullanımda bunlar aynıdır.

Kurallara gelince, çok fazla tıkanmam ve sadece istediğiniz gibi kullanın - hayatta daha önemli şeyler var ve kod yine de aynı olacak.

Kullanmakta olduğunuz tam sayıların boyutunu belirtmeniz gereken yerlerde bina sistemleri buluyorsanız ve Int16, Int32, UInt16, UInt32 vb. kullanma eğiliminde olursanız, o zaman String - ve taşınırken daha doğal görünebilir. Farklı .net dilleri arasında, işleri daha anlaşılır hale getirebilir - aksi takdirde string ve int kullanırım.

    
234
2018-02-06 12: 39: 09Z
  1. + 1, hayatta daha önemli şeyler olduğunu belirtmek için + 1 burada, bir başka önemsiz meselesiyle ilgili başka bir StackOverflow milyonlarca en fazla soru sorulduğunu düşünüyorum yer alıyor: 2014-04-12 19: 32: 17Z
  2. Sadece bir tanesini seçin ve tutarlı olun. Ev tarzında bir yerde çalışıyorsanız, bunu kullanın.
    2015-03-16 16: 32: 52Z
  3. maalesef stil kişisel bir tercihtir ve kod sahibi olmayan birkaç ekip arasında geniş bir kod tabanında zorlamak çok pahalı olabilir. String vs String yerine her zaman dikkat edilmesi gereken daha önemli konular vardır. bu da bizi "yaşamdaki daha önemli şeylere" geri getiriyor
    2016-02-24 06: 51: 16Z
  4. Bu kesinlikle tercih edilen bir şeydir; örneğin: short, int, ushort, uint, Int16, vb. kullanmayı tercih ediyorum. Çünkü bu şekilde öğrendim. Verilen, Int16'un daha az deneyime sahip olanları hemen anlaması daha kolaydır. +1 Benden!
    2019-01-02 19: 18: 08Z

Biçimlendirme nedenleriyle büyük harfli .NET türlerini (takma adları yerine) tercih ederim. .NET türleri, diğer nesne türleriyle aynı renktedir (sonuçta değer türleri uygun nesnelerdir).

Koşullu ve kontrol anahtar kelimeleri (if, switch ve return gibi) küçük harf ve koyu mavi renktedir (varsayılan olarak). Ve kullanım ve formatta anlaşmazlık olmamasını tercih ederim.

düşünün:

 
String someString; 
string anotherString; 
    
191
2016-09-28 11: 58: 18Z
  1. Ayrıca şöyle bir kod yazıyor musunuz: Int32 i = 1; İnt i = 1 yerine; ? Kullanılabilir olduğunda dize diğer adını kullanmama tutarsız görünüyor.
    2013-01-28 10: 49: 37Z
  2. @ nashwan: aslında, evet, Int32 i=1; yerine int i = 1; kullanıyorum Eskiyi amacımla ilgili olarak daha okunaklı buluyorum: yani 32 bit imzalı olarak istiyorum tamsayı.
    2013-02-15 17: 30: 42Z
  3. Eh, geliştiricinin C # kodu (string) veya .NET kodu (String) yazdıklarını sandıklarına göre değişir. Şahsen her şeyden önce C # yazdığımı düşünüyorum (ve .NET kullanan C #).
    2014-04-15 13: 09: 24Z
  4. @ Alex: amacım belirsizliği gidermek için kodlamada çok özel olmayı tercih etmemdi.
    2015-04-27 02: 56: 54Z
  5. Spektrumun mutlak diğer ucunda, hemen hemen her zaman sadece var kullanırım
    2016-03-18 15: 38: 29Z

string ve String, her şekilde aynıdır (büyük harf "S" hariç). Hiçbir şekilde performans çıkarımı yoktur.

Sözdizimi vurgulaması nedeniyle çoğu projede küçük harf string tercih edilir

    
180
2011-11-19 09: 37: 17Z
  1. Jeffrey Richter, burada meydana gelen karışıklığı önlemek için her durumda CLR tipini (C # CLR ile) kullanmanızı önerir.
    2008-10-18 17: 02: 29Z
  2. Açıkçası, S veya s kullanıp kullanmadığınız bu sorulara neden olmuş olacak, yani Richter'ı aşağı oyla. ;)
    2008-10-18 17: 17: 18Z
  3. Richter, dizgenin bir seçenek olmaması gerektiği anlamına geliyordu - Microsoft bu dilde olmamalıdır. Richter'ı oy kullanamazsın - o bir efsane! :)
    2008-10-18 19: 23: 07Z
  4. olabilir 'in diğer ada sahip olmamasının daha iyi olacağına katılıyorum. Ancak, onlara sahip olduğumuza göre, onları kullanmanın uygun olduğunu düşünüyorum (ancak yöntem adlarında vb. Değil)
    2008-10-19 06: 34: 50Z
  5. "string", "String" ile aynı değildir. "System.String" anlamına gelir. Bu nedenle, "String" kullanıyorsanız, ad alanını dahil etmek için "System" kullanarak "koymak zorundasınızdır
    2011-12-03 16: 41: 29Z

C #, CLR ile birlikte kullanılan bir dildir.

string , C # türündedir.

System.String , CLR’de bir türdür.

CLR ile birlikte C # kullandığınızda string System.String ile eşlenir.

Teorik olarak, Java bayt kodunu üreten bir C #-derleyicisi uygulayabilirsiniz. Bu derleyicinin mantıklı bir uygulaması, Java çalışma zamanı kitaplığıyla birlikte çalışmak için büyük olasılıkla string - java.lang.String 'u eşleştirir.

    
171
2015-12-25 12: 55: 26Z
  1. string C # da türü değil ; CLR'deki bir türe eşlenen ayrılmış bir kelimedir.
    2011-07-31 17: 58: 52Z
  2. @ CesarGon: ECMA-334, bölüm 8.2.1'e göre: "C # önceden tanımlanmış tipler sunar [...] Önceden tanımlanmış referans tipleri nesne ve string . "
    2011-07-31 19: 03: 30Z
  3. ECMA-334, bölüm 9.4.3'e göre "string" bir anahtar kelimedir. :-) Anlamsallığa odaklanırsanız "dizge" nin bir tür olduğuna katılıyorum, ancak sözdizimine odaklanırsanız bunun bir anahtar kelime (yani ayrılmış bir kelime) olduğunu söyleyebilirim. Standart, her iki bakış açısını da destekler (belki de çok belirsiz!). Bana göre, OP sözdizimi ile ilgili, bu yüzden cevaplara baktığımda sözdizimine odaklanma eğilimindeyim, ama ben de amacınızı görüyorum. Dahası, cevabınız, olduğu gibi, iki farklı türün var olduğu anlamına gelebilir: dize ve String, böyle olmadığında. Biri diğerinin eşlemesi.
    2011-07-31 19: 30: 23Z
  4. Bunun hakkında açık konuşalım. 'string', ayrılmış bir diğer addır. Bu gerçek bir veri türü değil. Başka bir şeye işaret eden bir şey. Tüm bu takma adları kaldırabilir (veya yalnızca hiç kullanmayın) ve mükemmel bir programlama diline sahip olabilirsiniz.
    2013-07-08 16: 50: 49Z

Bu YouTube videosu pratik olarak nasıl farklı olduklarını gösterir.

Ama şimdi uzun bir metinsel cevap için.

.NET hakkında konuştuğumuzda, biri .NET çerçeve, diğeri ise bu çerçeveyi kullanan diller (C#, VB.NET vb.) olmak üzere iki farklı şey vardır.

 resim tanımını buraya girin

"System.String" a.k.a "Dize" (büyük "S"), .NET çerçeve veri türüdür, "dize" C# veri türüdür.

resim tanımını buraya girin

Kısaca "String", "string" in bir diğer adıdır (farklı adlarla aynı şey). Dolayısıyla teknik olarak her ikisi de aşağıdaki kod ifadeleri aynı çıktıyı verecektir.

 
String s = "I am String";

veya

 
string s = "I am String";

Aynı şekilde, aşağıda gösterildiği gibi diğer c # veri türüne ilişkin diğer adlar vardır: -

nesne: System.Object, string: System.String, bool: System.Boolean, bayt: System.Byte, sbyte: System.SByte, kısa: System.Int16 ve benzeri

Şimdi programcının bakış açısından milyon dolarlık soru "Peki" ve "string" ne zaman kullanılır?

Karışıklığı önlemek için ilk şey, onlardan birini tutarlı bir şekilde kullanın. Ancak değişken bildirimi yaptığınızda en iyi uygulamalara göre "string" (small "s") kullanmak iyidir ve bunu bir sınıf adı olarak kullanırken "String" (büyük harf "S") tercih edilir.

Aşağıdaki kodda sol taraf değişken bir bildiridir ve "string" ile bildirilir. Sağ tarafta bir yöntem çağırıyoruz, böylece "String" daha mantıklı.

 
string s = String.ToUpper() ;
    
157
2015-02-28 10: 48: 34Z
  1. "Kısacası" String "," string "" nin bir diğer adıdır (farklı adlarla aynı adı verilir). Bu doğru değil: takma ad "string" dir.
    2014-11-06 12: 04: 10Z
  2. değişken bildirimi yaptığınızda "string" (small "s") kullanmak ve sonra "String" sınıf adı olarak kullanmak iyidir (büyük harf "S") tercih edilir. Bu sözleşme artık geçerli görünmüyor: Visual Studio 2015 kullanıyorsanız ve String yazmayı denerseniz, "kodunuzu basitleştirmenizi" öneririz, string'a taşıyorsunuz ...
    2016-11-04 14: 11: 45Z

Küçük harf string, System.String için takma addır. Onlar C#’da aynı.

Sistem türleri (System.Int32, System.String, vb.) türleri veya C# aliases (int, string, vb.) kullanmanız gerekip gerekmediği konusunda tartışmalar vardır. Şahsen C# aliases'u kullanmanız gerektiğine inanıyorum, ancak bu benim kişisel tercihim.

    
148
2017-08-14 04: 33: 23Z
  1. Sorun bu, 'C #' takma adları değil, 'C' takma adı. C # dilinde yerel 'string' veya 'int' yoktur, sadece sözdizimsel şeker vardır.
    2015-05-29 20: 23: 54Z
  2. , "C" nin nereden geldiğinden emin değil, çünkü C # 5 dil belirtimi "Anahtar sözcük dizgisi yalnızca önceden tanımlanmış bir System.String sınıfı için bir diğer ad." Sayfa 85, paragraf 4.2.4. Tüm yüksek seviyeli diller, CPU komut setleri ve bayt kodları üzerine sözdizimsel bir şekerdir.
    2016-02-24 06: 57: 31Z

    string, System.String için yalnızca bir takma addır. Derleyici onlara aynı şekilde davranacaktır.

    Tek pratik fark, bahsettiğiniz şekilde vurgulanan sözdizimidir ve using System kullanıyorsanız String yazmanız gerekir.

        
    145
    2011-12-03 19: 53: 47Z
    1. Dize kullanmak için Sistemin önekini girmenize gerek yok.
      2008-10-18 19: 24: 16Z
    2. using System kullanırken String kullanmanız gerekir, aksi halde aşağıdaki hatayı alırsınız: The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
      2009-10-16 17: 53: 00Z

    İkisi de aynı. Ancak kodlama kılavuzları açısından string yerine String kullanmak daha iyidir. Genelde geliştiricilerin kullandığı şey budur. Örneğin. Int32 kullanmak yerine int kullanıyoruz, int, Int32 takma adıdır

    Bilginize “Anahtar kelime dizgisi, önceden tanımlanmış System.String sınıfı için bir takma addır.” - C # Dil Belirtimi 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

        
    130
    2017-08-14 05: 16: 40Z

    Diğerlerinin dediği gibi, onlar aynı. StyleCop kuralları, varsayılan olarak, string'u System.String, String.Format, String.Join, vb. Gibi String.Concat statik işlevlerine gönderme yapmazsanız, C # kod stili en iyi uygulama olarak kullanmaya zorlar.

        
    110
    2011-11-19 09: 35: 51Z
    1. StyleCop'un String kullanımı için bayrak kullanacağının farkında değildim - statik yöntemler dışında. Ben her zaman kullandığım şekilde harika olduğunu düşünüyorum: tür bildirimleri için dize ve statik üyelere erişdiğimde dize.
      2011-05-05 18: 41: 26Z

    6 yıl ve 5 ay sonra yeni cevap (erteleme).

    string, her zaman sabit bir anlama sahip ayrılmış bir C # anahtar sözcüğü olsa da, String, yalnızca herhangi bir şeye başvurabilecek sıradan bir tanımlayıcısıdır . Geçerli türün üyelerine, geçerli ad alanına ve uygulanan using yönergelerine ve bunların yerleşimine bağlı olarak, String, global::System.String'dan farklı bir değer veya tür olabilir.

    using direktiflerinin yardımcı olmayacağı iki örnek vereceğim .


    İlk olarak, String geçerli türün (veya yerel bir değişkenin) value olduğu durumlarda:

     
    class MySequence<TElement>
    {
      public IEnumerable<TElement> String { get; set; }
    
      void Example()
      {
        var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
      }
    }
    

    IEnumerable<>, Format adında statik olmayan bir üyeye sahip olmadığı ve hiçbir uzatma yöntemi uygulanmadığından yukarıdakiler derlenmeyecek. Yukarıdaki durumda, String'u türü nin sözdizimsel olarak tek olasılık olduğu başka bağlamlarda kullanmak da mümkün olabilir. Örneğin, String local = "Hi mum!"; Tamam olabilir (ad alanına ve using yönergelerine bağlı olarak).

    Daha kötüsü: String.Concat(someSequence)’un muhtemelen (using s’ye bağlı olarak) Linq eklenti yöntemi Enumerable.Concat’a gideceğini söylemek. string.Concat statik yöntemine gitmeyecek.


    İkincisi, String başka bir ty ise, geçerli türün içine yerleştirilmiş:

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

    Example yöntemindeki hiçbir ifade derlenmez. Burada String her zaman bir piyanodur string , MyPiano.String. Üzerinde hiçbir üye (static veya değil) Format yoktur (veya temel sınıfından miras alınmıştır). Ve "Goodbye" değeri buna dönüştürülemez.

        
    92
    2015-01-15 14: 21: 22Z
    1. Bir şey olabilir sanırım: using String = System.Int32; using Int32 = System.String; ve ardından hataları sayın.
      2015-05-08 00: 40: 28Z
    2. bu doğru cevap. string, System.String’dur. String herhangi bir şey olabilir.
      2018-10-09 20: 26: 00Z
    3. Kabul Edilen @DaveCousineau - takma adın amacı budur. System.String nesnesine ayarlanmayacak başka bir String türü oluşturabilirsiniz. Çıkış: blog.paranoidcoding .com /2019/04/08 /...
      2019-04-11 16: 37: 15Z
    4. "string anahtar sözcüğü C # dilinde somut anlam ifade eder. Temel çalışma zamanı derlemesinde var olan System.String türüdür. Çalışma zamanı, bu türü kendinden anlar ve geliştiricilerin beklediği yetenekleri sağlar. .NET'te strings için onun varlığı C # için çok önemlidirbu tür yoksa, derleyici bir kod satırını ayrıştırma girişiminden önce çıkacaktır. Dolayısıyla, string'un C # kodunda kesin ve açık bir anlamı vardır. String tanımlayıcısının C # ile somut bir anlamı yoktur. Tüm ad arama kurallarını Widget, Student, vb. Olarak geçen bir tanımlayıcıdır… "
      2019-04-11 16: 40: 28Z
    5. 2019-05-23 05: 46: 50Z

    Sistem türlerini kullanmak, eğer böyle bir şey yapıyorsanız C # ve VB.Net arasında bağlantı kurmayı kolaylaştırır.

        
    91
    2008-09-22 19: 40: 08Z
    1. C # ve VB.NET arasında dönüştürme işlemi olduğu kadar kolaydır. developerfusion.com/tools/convert/vb-to-csharp
      2011-07-01 20: 35: 22Z

    Diğer programcılar arasında ortak bir uygulama gibi görünen şeye rağmen, String'dan string'a String'u tercih ediyorum, sadece string'un bir referans türü olduğunu vurgulamak için Jon Skeet'in söylediği gibi.

        
    83
    2011-11-19 09: 35: 06Z

    System.String, string'un takma adıdır (veya kısa yol). Bu, System.String yazarak System.String demek istediğimizi gösterir. Think linkinde daha fazlasını okuyabilirsiniz: 'string' takma isimdir /System.String'in kısayolu.

        
    78
    2016-10-08 18: 50: 20Z

    String (Boolean vs. bool), temel sınıf kütüphanesindeki bir sınıftır. string (küçük harf), System.String'in diğer adı olan C # 'da ayrılmış bir çalışmadır. Int32 vs int,

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
    ile benzer bir durumdur. Bu C # dile özgü anahtar kelimeler, ilkelleri C'ye benzer bir tarzda bildirmenize olanak sağlar.     
    70
    2013-12-24 04: 50: 19Z

    Bunu Ritchers kitabındaki lusus cevabına eklemek istiyorum:

      

    C # dili belirtimi, “Tarz olarak, anahtar kelimenin kullanımı tercih edilir.   tam sistem tipi adının kullanılması. ”Dil belirtimine katılmıyorum; tercih ederim   FCL tipindeki isimleri kullanmak ve ilkel tip isimlerden tamamen kaçınmak için. Aslında, keşke   derleyiciler ilkel tür adlarını bile teklif etmediler ve geliştiricileri FCL'yi kullanmaya zorladılar   bunun yerine adları yazın. İşte nedenlerim:

         
    • string kullanıp kullanmayacağımı bilmeden, bazı geliştiricilerin kafasının karıştığını gördüm.   veya kodlarında Dize . Çünkü C # string (bir anahtar kelime) tam olarak    System.String (bir FCL türü), fark yoktur ve her ikisi de kullanılabilir. Benzer şekilde,   Bazı geliştiricilerin, uygulama sırasında int 'in 32-bit bir tam sayıyı temsil ettiğini söylediğini duydum   32 bit işletim sistemi üzerinde çalışıyor ve uygulama olduğunda 64 bitlik bir tam sayıyı gösterdiğini   64 bit işletim sistemi üzerinde çalışıyor. Bu ifade kesinlikle yanlıştır: C # 'da, bir int her zaman eşlenir    System.Int32 'ye, bu nedenle işletim sisteminden bağımsız olarak 32 bit bir tam sayıyı gösterir.   kod çalışıyor. Eğer programcılar istersenKodlarında Int32 kullanın, sonra bu potansiyeli kullanın   karışıklık da ortadan kalkar.

    •   
    • C #, uzun , System.Int64 ile eşleşir, ancak farklı bir programlama dilinde uzun    Int16 veya Int32 ile eşlenebilir. Aslında, C ++ /CLI uzun 'u bir Int32 olarak görür.   Kaynak kodu tek bir dilde okuyan bir kişi kodun kodunu kolayca yanlış yorumlayabilir   farklı bir programlama dilinde programlamaya alışmış olsaydı niyet.   Aslında, çoğu dil uzun bir anahtar kelime olarak bile değerlendirilmez ve kod derlemez   onu kullanır.

    •   
    • FCL, tür adlarına sahip yöntem adlarının bir parçası olarak birçok yönteme sahiptir. İçin   örneğin, BinaryReader türü, ReadBoolean , ReadInt32 gibi yöntemler sunar,    ReadSingle , vb. ve System.Convert türü gibi yöntemler sunar    ToBoolean , ToInt32 , ToSingle , vb. Aşağıdakileri yazmak yasal olsa da   kod, kayan nokta içeren satır bana çok doğal geliyor ve satırın belli olmadığı açık.   Doğru:

       String
    •   
    • C # kullanan çoğu programcı, diğer programlamayı unutma eğilimindedir.   CLR'ye karşı diller kullanılabilir ve bu nedenle C # -isms,   sınıf kütüphanesi kodu. Örneğin, Microsoft’un FCL’si neredeyse yalnızca C # ve   FCL ekibindeki geliştiriciler artık kütüphaneye gibi yöntemler eklemiştir.    Dizi 'nin, C #' da uzun olan, ancak uzun olan bir Int64 değeri döndüren GetLongLength   Diğer dillerde (C ++ /CLI gibi). Başka bir örnek ise System.Linq.Enumerable ’dir.    LongCount yöntemi.

    •   

    Paragrafın tamamını okumadan önce onun fikrini anlamadım.

        
    70
    2018-12-05 09: 34: 21Z

    string bir anahtar kelime değildir ve Tanımlayıcı olarak kullanılabilir, string ise bir anahtar kelimedir ve Tanımlayıcı olarak kullanılamaz. Ve işlev açısından her ikisi de aynıdır.

        
    64
    2011-11-19 09: 35: 19Z

    Partiye geç gelmek: CLR tiplerini zamanın% 100'ünü kullanıyorum (peki, C # tipini kullanmaya zorlamadıysa hariç, ama en son ne zaman olduğunu hatırlamıyorum. ).

    Başlangıçta bunu yıllar önce Ritchie'nin CLR kitaplarına göre yapmaya başladım. Bana göre, tüm CLR dillerinin sonuçta CLR türlerini destekleyebilmesi gerektiğine değindi, bu nedenle CLR türlerini kullanarak daha net ve muhtemelen daha fazla "yeniden kullanılabilir" kodu sağlayın.

    Şimdi yıllardır yapıyorum, bu bir alışkanlık ve VS'in CLR tipleri için gösterdiği renklendirmeyi seviyorum.

    Tek gerçek düşürücü, otomatik tamamlamanın C # türünü kullanmasıdır, bu yüzden CLR türünü belirtmek için otomatik olarak oluşturulan türleri yeniden yazarım.

    Ayrıca, şimdi, "int" veya "string" gördüğümde, 1970'lerin C koduna bakıyorum gibi, bana gerçekten çok yanlış geliyor.

        
    64
    2012-08-24 15: 22: 47Z

    Bu gerçekten bir kongre meselesi. Int32 daha çok C /C ++ stiline benziyor. Genel kural, seçtiğiniz dilin sağladığı kısayolları kullanmaktır (decimal için int /Int). Bu, "nesne" ve Int64 için de geçerli.

    Teorik olarak bu, kodu "int" nin int anlamına gelebileceği 64-bit standarda getirmeye yardımcı olabilir, ancak mesele bu değil ve herhangi bir yükseltme sihirbazının herhangi bir Int32 referansını string'a değiştirmesini beklerdim güvenli.

        
    59
    2018-10-03 04: 24: 47Z

    Fark yok.

    C # anahtar sözcüğü System.String, .NET türü int ile eşleşir- dilin adlandırma kurallarına uygun bir takma addır.

    Benzer şekilde, System.Int32, int*’a eşlenir.

        
    47
    2012-01-15 00: 30: 34Z
    1. 64 bit derlemede, int System.Int64 (8 bayt), 32 bit derlemede System.Int32 (4 bayt) ile eşlenir
      2012-07-25 15: 26: 08Z
    2. 2013-04-17 07: 18: 49Z
    3. IntPtr ve UIntPtr, platforma göre boyutu değiştiren tek türlerdir ( actual
      string String = "I am a string";
      
      gibi işaretçi türlerini ve [U] IntPtrs'den oluşan türleri dikkate almaz) veya gerçek işaretçiler).
      2013-04-23 21: 20: 46Z
    4. 2013-05-23 22: 37: 50Z

    Bu konuda Daniel Solis 'kitabı 'dan bir alıntı var >.

      

    Tüm önceden tanımlanmış türler doğrudan ile eşleştirilir   temel .NET türleri. C # tipi isimleri (string) basitçe takma isimlerdir.   .NET türleri (String veya System.String), bu nedenle .NET adlarını kullanmak   bu önerilmez. Bir C # programında C # adlarını kullanmalısınız.   .NET adları yerine.

        
    42
    2016-12-11 05: 27: 45Z

    string bir anahtar kelimedir ve string'i tanımlayıcı olarak kullanamazsınız.

    Dize bir anahtar kelime değildir ve onu tanımlayıcı olarak kullanabilirsiniz:

    Örnek

     string

    System.String anahtar sözcüğü, takma adıdır   

     typeof(string) == typeof(String) == typeof(System.String)
    
    anahtar kelime sorun bir yana, iki tam olarak  eşdeğer.  bool     
    39
    2016-03-16 19: 35: 32Z
    1. Tek küçük fark, String sınıfını kullanırsanız, Dosyanın üstüne Sistem ad alanını içe aktarmanız gerekmekte olup, bunu yapmanız gerekmez. string anahtar kelimesini kullanırken.
      2018-03-04 09: 29: 34Z
    2. Eşitlik ifadesinin başarısız olacağı basit kullanım durumları vardır ... Örneğin, blah ad alanında bir tür çağrısı tanımlamak ve bu ad alanını dosyaya aktarmak gibi eşitlik bildirimi çalışıyor.
      2019-06-04 13: 36: 55Z

    Evet, aralarındaki fark yok, tıpkı Boolean ve string gibi.

        
    38
    2015-12-25 12: 55: 50Z

    İki - arasında bir fark yoktur, ancak diğer geliştiricilerin kaynak kodunu göz önüne alırken tercih edilen seçenek olarak görünmektedir.

        
    33
    2011-11-19 09: 34: 52Z
kaynak yerleştirildi İşte
Diğer sorular