Soru C # ile String arasındaki dize arasındaki fark nedir?


Örnek (davayı not etmek):

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

Neler var kılavuzlar her biri için? Ve ne var farklar?


5362


Menşei


@ O.R.Mapper, ama gerçek şu ki string bir sözlük C # yapı dilbilgisi buna karşılık System.String sadece bir türüdür. Herhangi birinden bağımsız olarak açık Herhangi bir özellikte belirtilen farklılık, hala bazı belirsizliklerle karşılanabilecek bu örtük farktır. Dil kendisi şart destek string Uygulama, BCL'de belirli bir sınıfı göz önünde bulundurmak zorunda değildir. - Kirk Woll
@KirkWoll: Dilin özelliklerine göre, dilin kendisi şart düşünmek string BCL tipi ile tamamen aynı olmak System.String, başka hiçbir şey. Bu hiç belirsiz değil. Tabii ki, C # dilbilgisini kullanarak kendi derleyicinizi uygulayabilir ve C # dil belirtiminde tanımlanmış olanla ilgili olmayan, keyfi bir şekilde bulunan tüm belirteçleri kullanabilirsiniz. Ancak, sonuçta ortaya çıkan dil sadece C # gibi görünürdü, C # olarak kabul edilemezdi. - O. R. Mapper
Kullanabilirsiniz string Sistem için bir yönerge kullanmadan. Bunu yapamazsın String. - Wilsu
Algol ve Fortran'dan gelen biri için, bu tartışma yanlış bir şey olduğunu gösteriyor. string. Kısaltmak için gereklidir System.Stringama, bir takma ad olarak, tıpkı tam olarak aynı şey değil, aynı gibi görünüyor. C # 'dan birkaç sene sonra, derdim ki, sadece kullanmak güvenlidir string ve string.Format() ve endişelenme System.String. - Roland
Bu tür bir soru 2017 yılında sorulduğunda, 4,000 indirimi, MSDN Dize sınıfı sayfasına 2.000 bağlantı ve üretken olmadı. - IRGeekSauce


Cevaplar:


string C # için bir takma addır System.String.
Teknik olarak, hiçbir fark yoktur. Gibi int  vs.  System.Int32.

Kurallara göre, genellikle kullanılması önerilir string Bir nesneye başvurduğunuz her zaman.

Örneğin.

string place = "world";

Aynı şekilde, genel olarak kullanılması önerilir String Özellikle sınıfa başvurmanız gerekirse.

Örneğin.

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

Bu, Microsoft'un kullanma eğilimindedir. onların örnekleri.

Görünüşe göre bu alandaki rehberlik değişmiş olabilir. StyleCop şimdi C # belirli takma adların kullanımını zorlar.


5097



Eğer StyleCop'u kullanmaya karar verirseniz ve bunu takip ederseniz, bu, dile özgü türleri kullanacağını söyleyecektir. Yani C # için string (String yerine), int (Int32 yerine), float (Single yerine) olacak - stylecop.soyuz5.com/SA1121.html - Dominic Zukiewicz
Her zaman takma adları kullanırım çünkü bir günlüğüne, bir soyutlama olarak hareket ettikleri için kullanışlı olabileceğini düşünmüştüm, bu nedenle uygulamalarının benim bilmeme gerek kalmadan değişebileceğini düşünüyorum. - Rob
Visual Studio 2015, String.Format'ın string.Format olarak değiştirilmesi gerektiğini söylüyor, bu yüzden Microsoft bu şekilde gidiyor. Ayrıca statik yöntemler için her zaman String kullandım. - Sami Kuhmonen
Bunları okuduğumda, bazı yorumların yanlış olduğunu görüyorum. @ DRAirey1 Zamanla, eski yolun hala en iyisi olduğunu göreceksiniz, eğer bundan şüpheleniyorsanız, Visual Studio kullanmadan C # kodu yazmayı denemeye cesaret edersiniz. Neredeyse imkansız ve zaman zaman web geliştirme işlerinde ortaya çıkan bir durum. @Vlad String kullanmak için herhangi bir şeyi içe aktarmanız gerekmez. @Abhi Yorumunuz anlamsız ve eşit derecede doğrudur string.Format(). @KlitosG Hayır, bu doğru değil. Hepsi aynı şekilde çalışıyorlar. - krowe2
Aslında, bir fark var mıdır? Örneğin: nameof(string) oysa derleme nameof(String)irade. - Jeroen Vannevel


Sadece bütünlük adına, işte bu konuyla ilgili bir beyin dökümü ...

Diğerleri de belirttiği gibi, string bir takma addır System.String. Aynı koda derlerler, bu nedenle uygulama zamanında hiçbir fark yoktur. Bu C # içindeki takma adlardan sadece biri. 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

Dışında string ve object, tüm takma adların türlerini değer. decimal bir değer tipidir, ancak CLR'de ilkel bir tip değildir. Takma adı olmayan tek ilkel tür System.IntPtr.

Spesifikasyonda, değer türü takma adlar "basit tipler" olarak bilinir. Literaller her basit tipin sabit değerleri için kullanılabilir; Başka hiçbir değer türü mevcut formlara sahip değildir. (Bunu VB ile karşılaştırın; DateTime literals ve bunun için bir takma adı var.)

İçinde bir durum var var takma adları kullanmak için: bir enum'un temel türünü açıkça belirtirken. Örneğin:

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

Bu, belirtimin enum bildirimlerini tanımladığı bir meseledir - kolondan sonraki kısım entegre tip bir jeton olan üretim sbyte, byte, short, ushort, int, uint, long, ulong, char... aksine tip Örneğin değişken bildirimler tarafından kullanılan üretim. Başka bir farklılık göstermez.

Son olarak, hangisinin kullanılacağı söz konusu olduğunda: kişisel olarak, uygulama için her yerde takma adları kullanıyorum, ancak herhangi bir API için CLR türü. Gerçekten uygulamada kullandığınız şey çok önemli değil - takımınız arasındaki tutarlılık güzel, ama kimsenin umurunda değil. Öte yandan, bir API'da bir türe başvurursanız, bunu bir dilde tarafsız bir şekilde yaparsınız. Bir yöntem denir ReadInt32 belirsiz, bir yöntem denir ReadInt yorumlama gerektirir. Arayanı tanımlayan bir dil kullanıyor olabilir. int takma adı Int16, Örneğin. .NET framework tasarımcıları bu modeli izlediler, iyi örnekler BitConverter, BinaryReader ve Convert sınıflar.


3037



Enum ile miras durumu ilginç. Diğer adların numaralandırma için neden kullanılması gerektiğine dair belgelere işaret edebilir misiniz? Yoksa bu bilinen bir böcek mi? - JaredPar
Spesifikasyonun 14.1 bölümündedir (burada çok uzun olduğu için kolayca alıntılayamıyorum). Açıkça, takma adı kullanmanız gerektiğini söylemez, ancak takma adlar bir çeşit kendi tipleri olarak kabul edilir. Her şey biraz garip. - Jon Skeet
@PiPeep ne kadar büyük miktarda vardiyadan daha şaşırtıcı olan düşük miktardaki düşük notlardır (en üstteki 5 yayın toplamda 2000'den fazla upvote'u göz önünde bulundurun, ve bunların hepsinde sadece 1 tane düşüş var). Özellikle de herhangi bir toplumda her zaman "haters" olduğu fikrini hesaba kattığınızda, bunu gerçekten inanılmaz buluyorum. - corsiKa
Arasındaki ilginç bir fark string ve String bu mu string' is a keyword in c#, so you can not use it as a variable name.For Ex: dize dize = "merhaba";//compiler error, but String String = "hi"; `kabul edilebilir String bir anahtar kelime değil bir kimliktir. - Sanjeev Rai
@SanjeevRai: Evet. Kullanabilirsiniz @string olarak biten bir tanımlayıcı oluşturmak için string gerçi. Bu bir kaçış mekanizması. - Jon Skeet


String anlamına gelir System.String ve bir .NET Framework türüdür. string takma addır C # dilinde System.String. Her ikisi de derlenmiş System.String IL'de(Orta Dil), bu yüzden bir fark yok. Ne beğendiğinizi seçin ve bunu kullanın. Eğer C # kodunu yazarsanız tercih ederim string C # türü takma addır ve C # programcıları tarafından iyi bilinir.

Aynı şeyi söyleyebilirim (int, System.Int32) vb..


608



Eğer C # kodluyorsanız, C # tipi takma ad olarak ve C # programmers` tarafından iyi bilinen bir dizeyi tercih ederim - bir C # kullanıcısı .NET çerçevesini bilmezse. +1 sanırım genelde bu en iyi cevap, ama bahsettiğim nokta tuhaf görünüyor. - MyDaftQuestions
Ben kişisel olarak değeri "Int32" kullanmayı tercih ediyorum, çünkü bu değer aralığını hemen gösteriyor. Daha sonraki yüksek bit sistemlerinde "int" türünü yükseltebilirlerse düşünün. c 'int' görünüşte görüldüğü gibi "hedef işlemcinin en verimli çalıştığı tamsayı türü"ve "en az 16 bit" olarak tanımlanır. Orada öngörülebilir tutarlılığı tercih ederim, çok teşekkür ederim. - Nyerguds
@MyDaftQuestions Ben katılıyorum. Eğer bir şey varsa sürekli olarak .net türlerini kullanın çünkü onlar dil bilgisizler ve tür açıkça bellidir, herhangi bir dilden bağımsızdırlar (tüm F # 'lerin ya da VB'nin idiosyncrasies'ini tanıyor muyum?). - Peter A. Schneider


C # ile verilen tür takma adlarını kullanma konusunda duyduğum en iyi cevap Jeffrey Richter kitabından geliyor. C # ile CLR. İşte onun 3 nedeni:

  • Kullanılması gerekip gerekmediğini bilemeyen bir dizi geliştiriciyi şaşkın gördüm sicim veya sicim Onların kodlarında. Çünkü C # dizesi (bir anahtar kelime) tam olarak System.String (FCL tipi) ile eşleşir, hiçbir fark yoktur ve ya kullanılabilir.
  • C # 'de, uzun ile eşleşir System.Int64ama farklı bir programlama dilinde uzun bir haritaya Int16 veya Int32. Aslında, C ++ / CLI aslında bir Int32. Bir dilde kaynak kodunu okuyan biri, farklı bir programlama dilinde programlama yapmak için kullanıldığında kodun niyetini kolaylıkla yanlış yorumlayabilir. Aslında, çoğu dil bile tedavi bile etmez uzun Bir anahtar kelime olarak ve kullanan kod 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ü gibi yöntemler sunar readBoolean, ReadInt32, ReadSingleve benzeri System.Convert türü gibi yöntemler sunar ToBoolean, ToInt32, ToSingle, ve bunun gibi. Aşağıdaki kodu yazmak yasal olmasına rağmen, float içeren hat bana çok doğal gelmiyor ve hattın doğru olduğu belli değil:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

İşte orada var. Bunların hepsi gerçekten iyi puanlar. Ancak, kendimi Jeffrey'nin kendi kodumdaki tavsiyesini kullanarak bulamıyorum. Belki de C # dünyamda takılıyorum ama kodumun çerçeve kodu gibi görünmesini sağlamaya çalışıyorum.


411



İkinci nokta aslında bir sebep gibi geliyor değil kullanmak string, int vb. - MauganRa
@MauganRa Ve olması gerekiyordu, kitabın yazarı neden o gibi nedenleri listeliyor kullanmayan adlar. - tomi.lee.jones
"Birisi C # kaynak kodunu okuyorsa, başka bir dil özelliğine değil, dil özelliğine göre yorumlamalıdırlar." Bu noktayı tamamen özlüyor. O kimse değil niyetinde Kodu yanlış yorumlamak için, bir kişinin beynin, başka bir bağlamda günlük olarak programcıdan gördüklerinden farklı bir anlamı olduğu zaman yanlış sonuca atlaması basitçe kolaydır. Hepimiz hata yaparız; Açıkça adlandırılan türlerin kullanılması, bu hataları daha az olası hale getirir. - Darryl
+ Bu nedenler konuyla ilgili duygularımı özetliyor. C # kodlama başladığımda (Java / C ++ / C arkaplanından geliyor), takma adların çirkin olduğunu düşünüyordum. Hala böyle hissediyorum, maalesef dünyanın çoğu benimle aynı fikirde değil gibi görünüyor ya da umursamıyorlar ve küçük harfleri kullanıyorlar. - gusgorman
@jinzai sorusu C # ile ilgili. longPlatform veya derleyici ne olursa olsun, imzalı bir 64 bit tam sayı olarak tanımlanır. Yani en azından bazı durumlarda evet yapar dile bağlı. - phoog


string ayrılmış bir kelimedir, ancak String sadece bir sınıf adıdır. Bu şu demek string kendi başına bir değişken adı olarak kullanılamaz.

Eğer bir sebepten dolayı değişken aradıysanız sicim, sadece bu derlemelerin birincisini göreceksiniz:

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

Eğer gerçekten bir değişken adı istiyorsan sicim kullanabilirsiniz @ önek olarak:

StringBuilder @string = new StringBuilder();

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


380



Yerel aramaları unutmayın @string Yerli isimlerin sadece PDB'lerde bulunması nedeniyle gerçekten anlamsızdır. İyi de diyebilirsin _string ya da başka birşey. Yansıtarak erişilebilen isimlere sahip olan şeyler için daha mantıklı. @string üye olurdu "string". - Roman Starkov
Ayrıca, değişken bir isim olarak ayrılmış bir kelimeyi de dikkate almazsınız. - Elton
"yığın taşması onları farklı şekilde vurgular". Daha fazla gerek yok :) - Ole Albers
OP, String veya string'i değişken adı olarak kullanmak istemez. Bunlar arasındaki farkın açıklamasını istediler Türleri. Cevabınız sadece daha fazla karışıklık IMO eklemek için hizmet vermektedir - Matt Wilko


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


327



varsayılan olarak çoğu insan bunu dosyanın herhangi bir yerinde herhangi bir şekilde ekler. VS, çoğu durumda hepsinde varsayılan olarak bunu yapar! - IbrarMumtaz
Varsayılan olarak sadece ekle using İfadelerimi istiyorum ve açık olmayan tüm şeyleri kaldırın. Güç Verimlilik Araçları> "[x] Kullanımları Kaydet ve Biçimlendir" - JMD
@JMD .cs şablon dosyasını değiştirdim, üstelik üstte herhangi bir ifade içermiyor! Sınıf şablonunu da değiştirdim internal sealed. - ErikE


Yukarıda ele alınmıştır; Ancak, kullanamazsınız string yansıma içinde; kullanmalısın String.


269





System.String .NET dize sınıfı - C # içinde string bir takma addır System.String - Kullanımda aynıdır.

Yönergelere gelince, çok fazla bogging yapamayacağımı ve sadece istediğin şeyi kullanabileceğini düşünmüyorum - hayatta daha önemli şeyler var ve kod yine de aynı olacak.

Kendiniz kullandığınız tamsayıların boyutunu belirtmek için gerekli olan bina sistemlerini bulursanız ve kullanım eğiliminiz varsa Int16, Int32, UInt16, UInt32 daha sonra kullanmak için daha doğal görünebilir String- ve farklı .net dilleri arasında dolaşırken işleri daha anlaşılır hale getirebilir - aksi takdirde string ve int kullanırdım.


204



Hayatta daha önemli şeyler olduğunu belirtmek için +1, burada bir başka StackOverflow milyonlarca önemsiz madde yer alıyor: en.wikipedia.org/wiki/Parkinson's_law_of_triviality - Sebastian
Sadece birini seç ve tutarlı ol. Ev stilinde bir yerde çalışıyorsanız, bunu kullanın. - Alan B
ne yazık ki stil kişisel tercihtir ve özel kod sahibi olmayan birkaç ekipte büyük kod tabanında zorlamak için çok pahalı olabilir. Dize vs Dize yerine dikkat çekmek için her zaman daha önemli konular vardır. Bu da bizi "hayattaki daha önemli şeylere" geri getiriyor - aiodintsov