VB gerçekten büyük / küçük harf duyarlı mı?


122

Burada bir tartışma başlatmaya çalışmıyorum, ancak herhangi bir nedenle, genellikle Visual Basic'in büyük / küçük harf duyarlı olduğu ve C dillerinin olmadığı (ve bir şekilde bu iyi bir şey) olduğu belirtiliyor.

Ama sorum şu: Visual Basic büyük / küçük harf duyarlılığı tam olarak nerede? Yazdığımda ...

Dim ss As String
Dim SS As String

... Visual Studio 2008 veya Visual Studio 2010 IDE'de, ikincisi " Yerel değişken SSmevcut blokta zaten bildirildi " uyarısına sahiptir . VBA VBE'de, hemen bir hatayı atmaz, bunun yerine durumu otomatik olarak düzeltir.

Burada, Visual Basic'in büyük / küçük harfe duyarlı olmadığına dair bu argümanla ilgili bir şeyi mi kaçırıyorum? (Ayrıca, yanıtlamayı biliyor veya önemsiyorsanız, bu neden kötü bir şey olsun?)

Neden bu soruyu soruyorum?

Visual Basic'i birçok lehçesinde yıllardır, bazen bir hobi olarak, bazen de bir çalışma grubundaki küçük işletmelerle ilgili programlar için kullandım. Son altı aydır beklediğimden çok daha büyük büyük bir proje üzerinde çalışıyorum. Dışarıdaki örnek kaynak kodunun çoğu C # dilinde. C # öğrenmek için yakıcı bir arzum yok, ancak bu C # tekliflerinde gözden kaçırdığım şeyler varsa Visual Basic'in sunmadığı (bunun tersi VB.NET XML Literatürü sunar ), o zaman isterim bu özellik hakkında daha fazla bilgi edinmek için. Yani bu durumda, genellikle C dillerinin büyük / küçük harf duyarlı olduğu ve bu iyi olduğu ve Visual Basic'in büyük / küçük harf duyarlı olmadığı ve bunun kötü olduğu tartışılır. Bilmek isterdim...

  1. İstesem de istemesem de kod düzenleyicideki her örnek büyük / küçük harfe duyarlı hale geldiğinden (yani büyük / küçük harf düzeltildiğinden) Visual Basic büyük / küçük harf duyarlılığı tam olarak nedir?
  2. VB.NET durumu kodla yapabileceklerimi bir şekilde sınırlandırıyorsa, bu benim C # 'a geçmeyi düşünmem için yeterince zorlayıcı mı?

5
+1 Daha önce aynı şeyi merak etmiştim.
NakedBrunch

7
Ummm ... değil emin ne CASE- anlıyoruz içinde hassas araçlarla. VB aslında durumda duyarsız olduğu için, P ve P olan C de olmaz, oysa, aynı ad.
Ed S.

1
@ed: İkisini de kullanamıyorum SSve VB'de ss, hangisini ilk kullanırsam editörün kullandığı şeydir.
Todd Main

1
Otaku, bu soruyu VB'nin büyük / küçük harfe duyarlı olmadığını söylemenin tam olarak ne anlama geldiğine ve nasıl uygulandığına odaklanmasını kesinlikle tavsiye ederim. Bir dilin harf büyüklüğüne duyarsız olmasının daha iyi olup olmadığı sorusu ne yazık ki bir ateş savaşı başlatabilir. Gerçekten merak ediyorsanız, başka bir soru ile sorun. (Bunu yapmamanızı tavsiye ederim, ancak daha sonra bunu öznel olarak etiketlemeniz ve topluluk
wiki'si

16
Bunu baş aşağı düşünüyorsunuz (veya düşünüyordunuz). Bunun nedeni derleyicinin büyük / küçük harfe duyarlı olmamasıdır çünkü hata 'zaten bildirilmiş SS değişkenini' okur. Büyük / küçük harfe duyarlı olsaydı, ya bir 'ss değişkeni kullanılmadı' ya da hiç hata almazsınız ve alternatif olarak birini ve diğerini kullanırsanız bir hata alırsınız.
Adriano Varoli Piazza

Yanıtlar:


108

VBA ve VB.NET arasındaki fark, VB.NET'in arka planda sürekli olarak derlenmesidir. VBA'yı derlerken bir hata alırsınız.

Gibi Jonathan diyor programlarken, küçük harf duyarsız dize karşılaştırmaları, XML, ve birkaç diğer durumlar dışında olarak VB.NET düşünebiliriz ...

Kaputun altındakiler ilginizi çektiğini düşünüyorum. Eh, .NET Ortak Dil Çalışma Zamanı büyük / küçük harfe duyarlıdır ve VB.NET kodu çalışma zamanına dayanır, bu nedenle çalışma zamanında büyük / küçük harfe duyarlı olması gerektiğini görebilirsiniz, örneğin değişkenlere ve yöntemlere bakarken.

VB.NET derleyicisi ve editörü bunu görmezden gelmenize izin verir - çünkü kodunuzdaki durumu düzeltirler .

Dinamik özelliklerle veya geç bağlama (Option Strict Off) ile oynarsanız, temel çalışma zamanının büyük / küçük harfe duyarlı olduğunu kanıtlayabilirsiniz. Bunu görmenin bir başka yolu da, C # gibi büyük / küçük harfe duyarlı dillerin aynı çalışma zamanını kullandığını, böylece çalışma zamanının büyük / küçük harf duyarlılığını açıkça desteklediğini fark etmektir.

DÜZENLE IDE'yi denklemden çıkarmak istiyorsanız, her zaman komut satırından derleyebilirsiniz . Kodunuzu düzenleyin Notepad sahip olduğu böylece ssve SSve derleyici ne yaptığını görmek.

DÜZENLEME alıntı Jeffrey Richter içinde .NET Framework tasarım yönergeleri sayfa 45.

Açık olmak gerekirse, CLR aslında büyük / küçük harfe duyarlıdır. Visual Basic gibi bazı programlama dilleri büyük / küçük harfe duyarlı değildir. Visual Basic derleyicisi, C # gibi büyük / küçük harfe duyarlı bir dilde tanımlanan bir türe yönelik bir yöntem çağrısını çözümlemeye çalışırken, derleyici (CLR değil), yöntemin adının gerçek durumunu anlar ve meta verilere yerleştirir. CLR bunun hakkında hiçbir şey bilmiyor. Şimdi, bir yönteme bağlanmak için yansıma kullanıyorsanız, yansıma API'leri, büyük / küçük harfe duyarlı olmayan aramalar yapma yeteneği sunar. Bu, CLR'nin büyük / küçük harf duyarlılığı sunma derecesidir.


Şimdiye kadar duyduğum en iyi cevap. VB.Net derleyicisinin ve editörünün bunu görmezden gelmenize izin verdiğini kanıtlamanın bir yolu var mı? Otomatik düzeltmeyi nasıl kapatmanın bir yolu var mı? Veya bir SLN derlemek için bir yol yoktur değil kullanımları hem o MSBuild VS IDE yazılmış ssve SSve onu derlemek ve çalışma beklendiği gibi?
Todd Main

5
Hile yaparak otomatik düzeltmeyi kapatabilirsiniz. Bir vb dosyasına sağ tıklayın ve "Birlikte Aç" ı seçin. Ardından "XML (Metin) Düzenleyici" gibi bir şey seçin. Otomatik düzeltme gibi VB'ye özgü tüm işlevleri kaybedeceksiniz.
Jonathan Allen

+1 harika cevap ve aynı zamanda iyi bir soru Otaku (sanırım zaten biliyordun ama iyi bir tanım çıkarmak istiyordun, değil mi?)
Anonymous Type

VB.NET derleyicisi / IDE% 100 büyük / küçük harf duyarlı değildir. Örneğin Dim pdfWriter As PDFWritertamamen geçerlidir. VB.NET, tamamen büyük / küçük harfe duyarlı dillerde yaygın bir uygulama olduğu için, sınıf adları ve değişken adları arasında ayrım yapmanıza olanak tanır, bu hoş bir dokunuş.
ingredient_15939

Birlikte çalışabilirlik için VB yöntemi doğrudur. Örnek: Dize olarak e-posta ve içinde inotifypropertychanged olayı olan özellik olarak E-posta () ile C #'da bir DLL oluşturun. C # iyi derleyecek ve DLL üretilecektir. Bu DLL'ye VB veya benzer bir dilde başvurmaya çalışın. Kitaplıkta değişken e-posta / E-postada bir çakışma olduğunu söyleyecektir. Kod analiz araçları, bunu VB derleyicisinde değil C # derleyicisinde bir sorun olarak işaret eder.
Venkat

22

Buradaki sorunun bir kısmı, dili IDE deneyiminden ayırmanız gerekmesidir.

Bir dil olarak, VB.NET , tanımlayıcılar açısından kesinlikle büyük / küçük harf duyarlıdır. Çağrı DateTime.Parseve datetime.parsetam olarak aynı koda bağlanacaktır. Ve C # gibi dillerden farklı olarak, yalnızca duruma göre farklılık gösteren yöntemleri veya türleri tanımlamak mümkün değildir.

Bir IDE olarak VB.NET, bir kod bloğunu güzelce listelediğinde mevcut tanımlayıcıların durumunu korumaya çalışır. Güzel listeler, geçerli mantıksal kod satırından her çıktığınızda ortaya çıkar. Bu durumda, ikinci bildirimden uzaklaşırsanız SS, güzel dinleyici, bu ada sahip mevcut bir tanımlayıcının olduğunu fark eder ve onu eşleşen büyük / küçük harfe sahip olacak şekilde düzeltir.

Bu davranış, yine de, tamamen bir kullanıcı katma değeri olarak yapılır. Çekirdek dilin bir parçası değildir.


1
Teşekkürler Jared, bunun sadece IDE olduğunu bilmek ilginç. Yine de birden fazla ismin farklı şeyleri temsil etmenin neden isimdeki durum farkına göre iyi bir şey olduğunu anlayamıyorum, ama sanırım bu başka bir gün için.
Todd Main

1
Jared'in sadece IDE olduğunu kastettiğini sanmıyorum . Bence bunu düşünür, böylece derleyici, harf duyarsız olduğunu söyledi düşünüyorum ssaynıdır SS, aynı zamanda IDE düzeltir okuma yardımcı olarak SSiçin sssiz yazarken. Dolayısıyla, IDE durumu düzeltmemiş olsa bile, derleyici yine de iki tanımlayıcının aynı olduğunu görecektir.
MarkJ

2
"Birden fazla isme sahip olmanın neden farklı şeyleri temsil etmesinin iyi bir şey olduğunu hala anlamıyorum" <- VBA / VB6 / VB.NET'ten C #'ye geçmeden önce aynı şekilde hissettim Sadece vakalara göre farklı isimlere sahip olmanın düpedüz tehlikeli olduğunu düşündüm. Ancak pratikte, oldukça yararlı olduğunu ve şaşırtıcı bir şekilde hataya hiç eğilimli olmadığını kanıtlıyor.
Mike Rosenblum

2
@Mike Bu noktaya pek katılmıyorum. Kafam karışmaktan başka bir şey yapan karışık harfli isimler hiç görmedim.
JaredPar

2
Gerçekten mi? Void SetColor (color Color) {this.color = color} gibi bir şeyi kastediyorum; Bunun tehlikeli görünebileceğinin farkındayım , ancak sorunsuz çalışıyor, derleyici hata yapmanıza izin vermiyor ve IntelliSense size "renk" ten sonra doğru üyeleri veriyor. ve "Renk". Burada beni rahatsız eden şey, "bu" kullanımının gerekli olmaması - FxCop ve / veya StyleCop tarafından zorlanıyor (bunu unutuyorum), ancak IDE'nin sınıfa erişirken bunu her zaman uygulayacağı bir ayar olmasını diliyorum potansiyel olarak kapsamın yanlışlıkla gölgelenmesine izin vermek yerine üyeler.
Mike Rosenblum

16

VB çoğunlukla büyük / küçük harfe duyarlı değildir, ancak istisnalar da vardır. Örneğin, XML değişmezleri ve anlaşılması büyük / küçük harfe duyarlıdır. Dize karşılaştırmaları genellikle T-SQL'in aksine büyük / küçük harfe duyarlıdır, ancak dize karşılaştırmalarını büyük / küçük harfe duyarlı hale getirmek için derleyici anahtarı vardır. Ve elbette, miras, COM ve Dinamik Dil Çalışma Zamanı ile uğraşırken ortaya çıkan uç durumlar vardır.


3
Durumun önemli olduğu XML Değişmezleri ve dize karşılaştırmaları gibi iyi noktalar. Ancak bunun çoğunlukla büyük / küçük harfe duyarlı olmadığını söylediğimizde , tam olarak neden bahsediyoruz? Ben yazarsanız, Outlook VBA üzerinde Moving, sadece bir örnek olarak, Dim mi as mailitemve subject = mi.subject, nesne adları otomatik olarak düzeltildikten alacak MailItemve mi.Subject. Derleyici önemsiyor mu (çünkü bunu her zaman otomatik olarak düzeltecektir) veya bu güzel kod mu yoksa ...?
Todd Main

1
Derleyici umursamıyor. Bunu, not defterinde bir dosyayı düzenleyerek ve komut satırı derleyicisini kullanarak test edebilirsiniz.
Jonathan Allen

9

Evet, VB.NET derleyicisi tanımlayıcıları büyük / küçük harfe duyarlı olmayan bir şekilde ele alır. Ve evet, bu, başka bir dilde yazılmış derlemeleri tükettiğinde veya COM bileşenlerini kullandığında sorunlara neden olabilir. İlk durum, Ortak Dil Belirtimi kapsamındadır . İlgili kural şudur:

İki tanımlayıcının farklı kabul edilebilmesi için, durumlarından daha fazla farklılık göstermeleri gerekir.

COM durumu, tür kitaplığı oluşturucu tarafından kabaca halledilir, aynı ada sahip tanımlayıcıların kasasını aynı olmaya zorlar. Bu tanımlayıcıların farklı rolleri olsa bile. Başka bir deyişle, "dizin" adlı bir yöntem parametresi, "Dizin" yöntem adının "dizin" olarak yeniden oluşturulmasını zorlayacaktır. Tahmin edebileceğiniz gibi, bu oldukça fazla kafa kaşınmasına neden oldu :)


6

VB büyük / küçük harf korumadır (IDE'de) ancak büyük / küçük harfe duyarlı değildir . Bir bakıma Windows dosya sistemi gibi. Hello.txt ve hello.txt aynı dosya adı olarak kabul edilir.

IDE, bir değişken bildiriminin bu değişken için "doğru" durum olduğunu varsayar ve bu değişkenin her örneğini bildirimle eşleşecek şekilde ayarlar. Bunu göze hoş gelen ve tutarlılık nedenleriyle yapar, ancak işlevsellik için değil.

Davanın beyanla eşleşecek şekilde otomatik olarak değiştirilmediği ve ifadenin aynı şekilde çalıştığı birkaç örnek gördüm. Ayrıca, farklı durumlarda gayet iyi derlenecek kod yazmak için herhangi bir metin düzenleyicisini de kullanabilirsiniz.

Bir yan not:

Çoğu İNSAN , büyük / küçük harfe duyarsız bir şekilde düşünür. "Köpek" kelimesini gördüğümüzde, kelime zihnimizde anlama dönüşür. Kelimenin anlamı büyük / küçük harfe dayalı değildir (yani "KÖPEK", "DoG" veya "dOG" yazıp yazmamasına bakılmaksızın.) BİLGİSAYARLAR, sözcükleri ayrı bit paketleri olarak görür. Büyük ve küçük harf farklı bit desenleridir ve bu nedenle farklıdır.

Çoğu programcı insan olduğundan, büyük / küçük harf duyarlılığı insanların düşünme biçimine daha çok uyarlanmış görünüyor ve büyük / küçük harf duyarlılığı daha çok insanların düşünme biçimlerini bir makinenin kısıtlamalarına uyarlamasıyla ilgilidir.


4
Programcıların nesneler ve sınıflar arasında ayrım yapması gerekmesi ve bunu yapmak için geleneksel olarak bir durum değişikliğini kullanması dışında (gerekli değildir, sadece bir kural). Böylece object.method()ve Object.Method()(bunu kodlama kurallarına uyar varsa) anında nesne ve sınıf referansları ve yöntemler olarak kabul edilmektedir. İngilizcede olduğu gibi, özel isimleri ve cümlelerin başlarını büyük harfle ayırırsınız. Bu yüzden okurken veya programlarken kayıtsız bir şekilde durumu düşünmüyorum, aksi takdirde bazı anlamları kaçırırdım.
Jason S

@ Jason, her şey alıştığın şeyle ilgili. Yeni C programlama öğrencileri ilk başta büyük / küçük harf duyarlılığı ile ilgili sayısız şikayette bulunurlar, ardından birkaç dersten sonra buna alışırlar. Object.method () ve Object.Method () yalnızca bir kuraldır ve büyük / küçük harf duyarlılığı için en güçlü durumdur. Aynı kapsamda temp ve Temp adlı iki değişkeni olan bir başkası tarafından yazılmış bir programı değiştirmek zorunda kaldım ve size onları kafamda tutmanın çok zor olduğunu söyleyeceğim. Yaygın bir ismi büyük harfle tanıyabilsek de, "bob" ve "Bob" kelimeleri beynimizde aynı anlama gelir.
Andrew Neely

IDE bu durumda neden vakayı koruyor? (afedersiniz). Bence IDE durumu koruyor çünkü MS tasarımcıları vakanın beyinde bir miktar anlambilimsel olduğunu düşünüyor, ki öyle. Ama gerçekte VB IDE , kafa karıştırıcı olduğunu düşünüyor formve Formaynı şey benim için. Durumda (tekrar özür dilerim) tempve Tempyeniden adlandırmak Tempiçin C # 'daki yeniden düzenleme araçlarını kolayca kullanabilirsiniz bobTemp. Ancak, bazı VB'yi sürdürüyorum ve biri gitti ve yaptı Dim form As Form. Şimdi yeniden adlandırdığımda, hem sınıf hem de nesne referanslarını yeniden adlandırıyor. Bleah!
Jason S

@Jason, VB'de her zaman "Dim aform as Form" diyorum ama konu dışına çıkıyorum. VB, aramada büyük / küçük harf duyarlılığını destekler. Ayrıca "Form Olarak" ifadesini arar ve onu "aptalca bir şey" ile değiştirir, sonra formu mantıklı bir adla yeniden adlandırır, sonra "aptal bir şey" i tekrar "Form Olarak" olarak yeniden adlandırırdım. Aslında davayı değiştirmeyi seviyorum, çünkü değişken adını şişman parmakla yapmadığımı doğrular.
Andrew Neely

Evet, ancak bu, adlar aynı olduğunda (veya yalnızca VB'de duruma göre farklılık gösterdiğinde) sınıf ve örnek referansı arasında ayrım yapacak bir yeniden düzenleme aracının yerini almaz. C # refactoring araçları bunu yapabilecek gibi görünüyor. Sınıfları ve örnekleri aynı şekilde adlandırmıyorum. C # 'da ayırt etmek için büyük / küçük harf kullanacağım, ancak VB'de bunu yapamıyorum, bu yüzden başa eklemek için harfleri kullanıyorum. Açıkçası benim sorunum, aynı adı kullanan başka birinin kodunu korumaktır. Ancak bu tartışma yorumlar için çok büyüyor, bu yüzden burada bırakacağım.
Jason S

5

Bu, kullandığınız düzenleyicinin bir parçasıdır, farklı davranabilirler ancak gerçek şu ki, Visual Basic gerçekten büyük / küçük harfe duyarlı olmayan bir dildir. Yani ssve SSaynı.

Daha fazla bilgi için lütfen VB.NET Basics eğitimine bir göz atın :)


Vay ilginçmiş. Bu detaya baktığım bir yer var mı? Henüz test etmedim, ancak VBScript hakkında düşünürken haklı olabilirsiniz.
Todd Main

@Otaku: Lütfen cevabıma tekrar bakın, bağlantıyı şimdi verdim. Teşekkürler
Sarfraz

VB'ye oldukça aşinayım, teşekkür ederim :) O sayfada neye bakmamı istediğinizden emin değilim.
Todd Main

3

Seni anladığımdan emin değilim VB büyük / küçük harf duyarlıdır, bu nedenle ss ve SS aynı değişkendir, bu nedenle derleyici, değişkeni yeniden tanımladığınızdan doğru bir şekilde şikayet eder.

Değişkenlerin büyük / küçük harfe duyarlı olmadığını, ancak işlev adlarının olduğunu düşünüyorum.


ama kullanırsam ssve daha sonra SSyazarsam ss, otomatik olarak düzeltiliyor , bu da bana derleyicinin durumu gerçekten önemsediğine inandırıyor.
Todd Main

5
@oTAKU: Bu, derleyiciyi değil, vakayı değiştiren IDE'dir.
John Saunders

2
VB hala davayı gerçekten önemsemiyor. IDE, değişkenlerin baştan sona aynı kalması için kodu temizlemeye çalışıyor.
guitarthrower

1

Evet, VB büyük / küçük harfe duyarlı değildir. Bazen alışık olmayanları bir döngü için fırlatır.


1

Bir tanımlayıcının farklı büyük / küçük harf "yazılışları" ile kod oluşturmak için VB.NET'te o kadar çok denemek zorunda değilsiniz. "Yeniden Adlandır" işlevi kullanılmadan bildirildiği dosyadaki bir tanımlayıcının büyük / küçük harflerinin değiştirilmesi, adın diğer dosyalarda güncellenmesine neden olmaz, ancak adı içeren herhangi bir satırı düzenlemek, mevcut tanıma uymasına neden olur.

Bu şekilde, VB.NET'in çoğunlukla büyük / küçük harfe duyarlı olmadığı belirlenebilir, ancak bu bilgileri büyük / küçük harfe duyarlı şekillerde kullanabilen CLR için tanımlayıcıların durumunu mümkün kılar.


1

Bunu ancak, 80'lerin başındaki programlama ders kitaplarımdan hatırladığım gibi, hassas dillerin (o zamanlar) kesinlikle derleme zamanı hatalarını azaltmayı amaçladığıdır. Yani "katılık", daha yüksek doğrulukta bir kodlama disiplini geliştirmeyi amaçlıyordu. Değişkenlerin, sınıfların, yöntemlerin, işlevlerin ve oraya atmak istediğiniz diğer her şeyin doğru şekilde etiketlenmesinin eklenmesi de ortaya çıktı.

Neredeyse tüm bu kitapların önde gelen büyük harf kullanımı, küçük harf vb. İçin önerilen bir model içerdiğini hatırlıyorum. Hepimizin bildiği gibi, bunların çoğu atıldı ya da uygulamada görmezden gelinmeli, üst düzey prodüksiyon evleri dışında mı demeliyim? CASE çözümleri veya daha yüksek bir beceri seviyesine ulaşmış olanlar için. Bence herkes bu öğrenme eğrisini yaşıyor.

Bu dillerin ve IDE'lerin ilerlemesi göz önüne alındığında, daha iyi soru, geliştirme zamanımı hangi dil geliştirir? Elbette çeşitli dillerin her birine aşina değilseniz, seçenekleriniz sınırlıdır.


1

İkinci sorunuzu cevaplamaya çalışacağım.

"Eğer VB.NET durumu kodla yapabileceklerimi bir şekilde sınırlandırıyorsa, bu benim C # 'a geçmeyi düşünmem için yeterli mi?"

C # kullanarak bir WCF WebService oluşturun. Bir DataContract (1 Sınıf) oluşturun. "String email" özelliğine sahip bir tane. Başka bir özellik olarak "dize E-postası" olan bir başka Kişisel e-posta veya ofis e-postası olarak anlama seçiminiz. Veya iki farklı DataContracts içinde olabilir.

C # için bu iyidir. Web hizmeti iyi oluşturulmuştur. AC # programı kolayca bir WSDL oluşturabilir ve her şey yolunda.

Şimdi VB (herhangi bir sürüm) ile bir WSDL oluşturmayı deneyin. "E-posta" nın zaten bildirildiğini ve WSDL oluşturma başarısız olduğunu söyleyecektir.

Bunun VB dilinde bir dezavantaj olduğunu düşündüğüm herkes gibi. Fakat!!!

FxCOP kullanın ve orijinal C # kodunu analiz edin. FxCOP, e-posta / E-posta kullanmanın bir sorun olduğunu söylüyor. Büyük / küçük harf duyarlılığını destekleyen farklı adlar kullanılmasını önerir. Ayrıca, tarih itibariyle .NET çerçevesinin 106 programlama diline sahip olduğunu ve büyük / küçük harf duyarlılığı AÇIK olan birçok dil olduğunu unutmayın. Hepimiz buluta doğru ilerliyoruz ve hizmetlerimizin tüm programlama platformları / dilleri tarafından erişilebilir olmasını istiyoruz.

Yani büyük / küçük harfe duyarlı olmak, programınızdaki seçiminizdir ve eğer C adamıysanız, bunu istersiniz. Program C olmayan diğer programlar tarafından kullanılacak / erişilecekse, büyük / küçük harf duyarlılığını desteklemeniz gerekir, ancak diliniz sizin seçiminizdir.

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.vbrad.com/article.aspx?id=65


Bulut, büyük / küçük harfe duyarlı olan (özellikle proxy'ler ve önbellek sunucuları için önemlidir) URI'ler kullanır.
binki

1

Sembollerin gizlenmesi (örn. Yerel gizleme alanı) da büyük / küçük harfe duyarlı değildir.

İşte bir örnek :

Public Class C
    Public Name As String

    Public Function M(name As String) As Boolean
        Return String.Equals(name, Name) ' case differs
    End Function
End Class

VB.NET derleyicisinin çıktısı aşağıdaki C # ile derlenmiştir (ve dolayısıyla eşdeğerdir):

public class C
{
    public string Name;

    public bool M(string name)
    {
        return string.Equals(name, name); // both lowercase
    }
}

string.Equalsalana iki kez geçilir. Yerel durum, durumdan bağımsız olarak gizlidir. Dil büyük / küçük harfe duyarlıdır.

Bu alan gibi bir üyeye açıkça atıfta bulunmak için, şu yolla üyeye referansta bulunmalısınız Me:

Return String.Equals(name, Me.Name) ' differentiate field from local

0

Sonunda açık 2. sorunuz hakkında kimsenin yorum yaptığını görmedim: "2: VB.NET vakası bir şekilde kodla yapabileceklerimi sınırlandırıyorsa, bu C #'a geçmeyi düşünmem için yeterince ikna edici mi?"

C # 'nin programcının programcının seçeneklerini sınırlamak yerine programcının seçmesine izin verdiği daha fazla seçenek yaklaşımını tercih ederim. C # 'i çok tercih ederim, ancak tek başına büyük / küçük harf duyarlılığı için, sadece büyük / küçük harfe duyarlı olduğu için bir dili öğrenmeye yakın olduğunu bile düşünmem. tüm özellikler önemli ve hem C # hem de VB.NET'in avantajlarına baktığımda, kesinlikle C # tercih ediyorum. ama size gerçek dengeli bir bakış açısı vereceğim, evet önyargılı, çünkü bir tercihim var, ancak C # 'ın dezavantajları konusunda da dürüst olacağım.

Öncelikle, her iki dilin de avantajları ve dezavantajları vardır. Bir dilde yapabileceğiniz, diğerinde yapılamayan farklılıklar, şükürler olsun ki Microsoft her iki dili de geliştiriyor ve her iki dile karşı da adil olmayan bir taraf tutmuyor gibi görünüyor.

C # ilk çıktığında, VB'nin C # 'da sevdiğim yöntemlerden önce koyabileceğiniz XML yorumları yoktu. VB.NET'te bundan nefret ediyordum. ancak yıllar içinde bir dilde olmayan birçok özelliğin diğerine eklendiğini gördüm. (MS geliştiricilerinden oluşan aynı ekip hem C # hem de VB geliştirir, bu nedenle özelliklerin oldukça benzer hale gelmesi mantıklıdır.)

ancak VB'nin sahip olmadığı C # 'ı sordunuz. işte hemen aklıma gelenler:

1: C # daha özlüdür ve daha az yazı yazmayı gerektirir .. BİRÇOK şekilde! Hatta tam tersi iddia yapıldığında, VB'nin yazmayı kurtardığı aptalca bir konuşma gördüm. ama lütfen size her iki dili de kullandıklarını ve ikisi tarafından da nadiren kullanılmadığını söyleyen insanları dinleyin. hem C # kullanıyorum veVB, C # evde sevdiğim için (ve işte C # ile çalıştığımda) ve daha yeni iş taleplerim C # değil VB kullanmamı talep ediyor. bu yüzden şimdi VB'yi daha sık kullanıyorum (şimdi yaklaşık 10 aydır), ancak kişisel ifademde daha çok C # tercih ediyorum ve gerçek yazım açısından VB önemli ölçüde daha fazla yazıyor. Aslında birinin VB'nin daha özlü olduğunu söylemeye çalıştığı okuduğum bir örnek, with'de uzun bir değişken olan bir 'with ...' örneği vermekti, bu nedenle VB'de sadece '.property' kullanabilirsiniz. VB'nin daha az yazıya ihtiyacı olduğunu iddia etmek aptallıktır. VB'nin daha kısa olduğu birkaç şey (ve sadece bu örnek değil) vardır, ancak gerçek uygulamada C # daha kısa olduğunda birçok kez vardır.

ancak C # 'nın daha kısa olduğuna inanmamın en büyük nedeni, VB'nin ayrıntılı "IF / THEN" ifadeleridir. ifadeler ortaksa. C # 'da yazılacak' sonra 'kelimesi yoktur! :) ayrıca tüm 'end ...' ifadeleri, c # 'da genellikle sadece bir kapatma ayracı olan'} 'yazmayı alır. Bazı kişilerin VB.NET'teki bu daha fazla ayrıntıların VB için bir avantaj olduğunu iddia ettiğini okudum, çünkü birkaç kapanış blok ifadesi / sembolü iç içe geçebilir ve birbirinin hemen yanında bitebilir, ancak kesinlikle katılmıyorum. Bir kişi bir programı C # veya VB ile başka bir programcıya göre neredeyse her zaman daha iyi yazabilir çünkü bir sonraki kod revizyonu daha iyi tasarlanabilir. bu, 'C #' da kafa karıştırıcı çok sayıda kapatma parantezi 'için geçerlidir, artı iç içe geçmiş blokların tümü birden fazla iç içe geçmiş IF'ler gibi aynı türdeyse, VB, C #' da olduğu gibi aynı sorunu yaşar. bu VB'de bir avantaj değildir. bu durum tam olarak neden kapanış sembolümün veya kapanış cümlenin her iki dilde ne ile birlikte gittiğini yorumlamayı seviyorum. evet, bunu yapmak daha ayrıntılıdır, ancak her iki dilde de açık olma seçeneğiniz vardır, bu da yargılamaya dayalı, duruma özgü özel durumlarda önemlidir. bence kod netliği oldukça önemli.

2: VB'nin çok satırlı açıklamaları yoktur. VB ile çalışırken umursamadım. sonra birkaç C-tarzı dile gittim. şimdi çoğunlukla işte VB.NET kullanıyorum ve onları özlüyorum. bu sadece uygun bulduğunuz ve sonra kaybetmeniz gereken bir şey. :(

3: VB'ler 'andalso' ve 'orelse', C # 'da basitçe' && 've' || 'olduğunda tüm bunları yazmak oldukça can sıkıcıdır. yine, daha az yazarak. bu hem VB hem de C # kodumda nadir değildir. herhangi bir şey varsa, işlevsellik açısından 'OR' ile 'OrElse' genellikle önemli değildir, ancak 'OrElse' bilgisayar için daha hızlıdır, bu nedenle bir programcı VB'de sadece 'Or' ve 'And' kullanırsa, o zaman için daha az optimal kod üretir. kodun netliğini seven biri. "Veya", "OrElse" den çok daha kolaydır.

4: C # kod yerleşiminde daha fazla esneklik. bir satır uzun olduğunda ve onu bir sonraki satıra kaydırmak istediğinizde, VB.NET'in kodumu 'kontrol etmekten' nefret ediyorum. C # bunu biraz yapar, ancak bunu C # 'da daha kullanışlı buluyorum, burada VB'de çok daha kontrol edici. ancak bu, dilin kendisinden ziyade daha çok VB.NET IDE ve C # IDE'dir. ama IDE farklılıkları olmayan dil özelliklerini mi yoksa tamamen mi istediğinizi bilmiyorum.

5: gerçekten özlediğim bir şey, C # 'da yeni bir kod bloğu oluşturmak, bir yöntemde çok şey olabilir ve çok küçük bir kod bloğunda bir değişken bildirmek istiyorum, ancak bu değişkeni bu bloğun dışında bildirmek istemiyorum tüm yöntem. C # 'da' {'ile yeni bir blok oluşturabilir ve onu'} 'ile bitirebiliriz. VB'nin böyle bir özelliği yoktur, ancak en yakın eşleşmesi koşulsuz bir 'If True Then' ve 'End If' bloğudur. (2 karakterli C # ve 18 karakterli VB.NET eşdeğerine tekrar dikkat edin ... VB'de daha fazla yazarak.)

6: öz Arttırma ve eksiltme operatörleri: ++ ve - gibi myVariable++ya ++myVariableveya eşdeğer eksiltme sürümleri. bu çok kullanışlı oluyor ... bazen. İşte C # 'ı çok özlediğimde gerçek bir kod örneği:

// C#:
while (txt.Length > x)
{
    thisChar = txt[x];
    if (charsAllowedWithoutLimit.Contains(thisChar)) { ++x; }
    else if (allowLettersWithoutLimit && char.IsLetter(thisChar)) { ++x; }
    else if ((x2 = charsAllowedWithLimit.IndexOf(thisChar)) >= 0)
    {
        ++x; if (++usedCountA[x2] > charAllowedLimit[x2]) { break; }
    }
    else { break; }
}

' VB.NET:
While (txt.Length > x)
    thisChar = txt(x)
    If (charsAllowedWithoutLimit.Contains(thisChar)) Then
        x += 1
    ElseIf (allowLettersWithoutLimit AndAlso Char.IsLetter(thisChar)) Then
        x += 1
    Else
        x2 = charsAllowedWithLimit.IndexOf(thisChar)
        If (x2 >= 0) Then
            x += 1
            usedCountA(x2) += 1S
            If usedCountA(x2) > charAllowedLimit(x2) Then Exit While
        Else
            Exit While
        End If
    End If
End While

Ve sadece C # kurallarının olduğu ÇOK iyi bir örnek vermek gerekirse, bu son zamanlarda kişisel olarak yazdığım kodlardan daha fazlası:

// C#
public static bool IsNotWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }

public static bool IsWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }

' And the VB equivalent is a mess! Here goes:
<Extension()>
Public Function IsNotWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsNotWithin(v%, value1%, value2%) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsNotWithin(v&, value1&, value2&) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsNotWithin(v@, value1@, value2@) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsWithin(v%, value1%, value2%) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsWithin(v&, value1&, value2&) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsWithin(v@, value1@, value2@) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

Belki de bu, C # 'nın daha özlü olduğunun enuf kanıtıdır. Ancak tüm programcılar özlü olmaktan hoşlanmaz. Bazıları "eğer a <b o zaman ..." okumayı tercih ediyor çünkü bu onların insan dili için daha doğal. Ve bu gayet iyi. Tercihler gayet iyi. Benim için el çabası değer verdiğim bir faktördür ve herkesin tercih ettiği herhangi bir sembolle düşünmeye alışabileceğini düşünüyorum, çünkü "eğer" ve "o zaman" bir alfabenin sembolleri ve C # 's "if (koşul) ifadesi;" sözdizimi de sembollerdir. biri programcı olmayanın sözdizimine diğerinden daha yakındır. özlü olanı tercih ederim.

Ayrıca, onu bir dizeden ziyade bir karakter değişmezi yapmak için VB'de karakter değişmezlerinden sonra 'c' kullanmanın can sıkıcı olduğunu düşünüyorum. C # 'ın bu konudaki özlülüğünü daha çok seviyorum. bir yöntem bir karakter değişmezi gerektirdiğinde, bir karakter uzunluğunda bir dize olmayan bir karakter sağlamanız gerekir, bu nedenle bazen ":"cC # 'da olduğu halde VB'de kullanmaya zorlanırsınız ':'. bence bu çok iyi bir şey.

Adil olmak gerekirse, ben gibi, yöntem çağrıları sonrasında boş parantez koymak zorunda değil gibi VB ister avantajları vardır diyecekler Dim nameUpper$ = name.ToUpperInvariantC # boş parantez gerektiriyor burada: string nameUpper = name.ToUpperInvariant(). : ya da bunu kırparak gibi o iki katına Dim nameUpper$ = name.Trim.ToUpperInvariantvs string nameUpper = name.Trim().ToUpperInvariant(). VB'nin $yukarıda C # 'ın bu kısayollara sahip olmadığı' As String 'ı karartmak için nasıl kullandığımı kısa bir şekilde kullanmasını seviyorum . VB, String, Integer, Long, Decimal, Single ve Double türleri için bu kısayollara sahiptir, ancak dezavantajı daha az nettir, bu yüzden dikkatli kullanıyorum. ancak yine de kısa kodu tercih ederim.

Eh, bu tecrübeli programcıdan sadece birkaç yorum ve düşündüğüm gibi, bu benim C # ile VB arasındaki programlama 'tanıklığı'. bence her ikisi de güzel diller tho. ama evet, hala daha çok C # tercih ediyorum.

ps Hayatımın çoğunu programlamayı planladığım için, en verimli klavyeyi kullanarak yazmayı yeniden öğrendim: Dvorak klavye, bir Qwerty klavyeye göre İngilizce yazmak için yaklaşık üçte bir çaba harcıyor. yukarı bak. belki siz de geçmek isteyebilirsiniz. ;) yazmamı% 67 kolaylaştırdı! :) Herkesi kalıpların dışında düşünmeye ve işinizde daha iyi verimliliği değerlendirmeye teşvik ediyorum. Dvorak Basitleştirilmiş Klavye Düzeni ve C # bunu benim için yaptı. :)

PSS i, Qwerty klavye düzeni ve VB ile Empirial ölçümlerin aksine Dvorak ve C # metrik ile karşılaştırılır. Dvorak, metrik ve C # sadece 'temizdir'. AMA VB gerçekten çok geride değil. Ancak eski VB6 kodu ve .NET öncesi kod ile geriye dönük uyumlu olma ihtiyacından muzdariptir, örneğin 'Or' vs 'OrElse' ve 'IIF ()' gibi.

Dikkatle bitiriyorum. Lütfen neden bahsettiklerini gerçekten bilmeyen insanları dinlemek konusunda daha ihtiyatlı olun. Hem VB hem de C # aleyhindeki tüm eksilerin yarısı değilartık herhangi bir sorun var ve insanlar hala dilde gerçekten dezavantajların ne olduğu konusunda cahil olduklarını söylüyorlar. Aklıma gelen en iyi örnek, VB'de üçlü kesme işareti veya C #'da üçlü eğik çizgi açıklama sembolleri kullanan yöntemler için XML yorumlarıdır. Ama lütfen bir kişinin cehaletten mi yoksa deneyimden mi konuştuğunu kendiniz ayırt edin. Kişisel tanıklık, gerçek deneyimlerinden bildikleri anlamına gelir. Ve birisinin bu konuda çok fazla deneyimi olduğunda, kulaklarınızı canlandırın. Hem C # hem de VB'de 10 yıldan fazla deneyime sahibim. Ve şuna kadar iniyor: her ikisi de (çok) iyi diller. Ve çoğu fark, kodu okuduktan sonraki 5 dakika içinde hemen görebilirsiniz. Ama evet, diğer özelliklerin bir dezavantaj bulması yıllar alabilir. Ve farkında olduğum bir dezavantaj (C # 'de), yapabilirim Hatta yararlı olacağı gerçek bir yaşam durumu düşünün. Yani belki de sonuçta bir handikap değildir.

Mutlu kodlamalar!


Tüm ayrıntıları takdir ediyorum, ancak örneğiniz C # 'ın neden bir şekilde "daha iyi" olduğunu göstermek için büyük / küçük harf duyarlılığı / duyarsızlık (söyleyebildiğim kadarıyla) kullanmıyor.
Todd Main

İkinci soruya doğrudan bir örnekle cevap vermeye çalıştım.
Venkat

@ToddMain, doğru. Ve benim örneğim, C # 'nın neden daha iyi olduğunu göstermek için büyük / küçük harf duyarlılığını kullanmıyor çünkü soru, büyük / küçük harfe duyarlılığın onu neden daha iyi yaptığını sormuyor . Ayrıca bu özelliğin kendi adına konuştuğuna inanıyorum. Ve mantığın, çoğu insanın bunu kendilerinin çıkarabileceği temel bir sonuç olduğuna inanıyorum. Ama biri sorarsa, mantığa ayak uydurmasına yardımcı olmaktan mutluluk duyarım. Ama arkadaşım bence farklı bir soru. ;)
Shawn Kovac

Aslında bu, orijinal gönderide sorulan iki sorudan biriydi. Bu apaçık ortada değil, bu yüzden sordum. Ancak soruyu ele almama konusunda endişelenmenize gerek yok.
Todd Main

@ToddMain, amacınızı anlıyorum. gerçekten çok adil bir nokta. :) Buna gözlerimi açtığın için teşekkürler. :)
Shawn Kovac

0

VB.NET büyük / küçük harf duyarlıdır.

Örnekler:

1.

Dim a As Integer
Dim A as Integer

2.

Sub b()
    'Some statement(s) here
End Sub
Sub B()
    'Some statement(s) here
End Sub

3.

Function c() As Integer
    'Some statement(s) here
End Function
Function C() As Integer
    'Some statement(s) here
End Function

Bunların tümü bir DERLEME ZAMANI HATASI atar .

1. örnek için, "Yerel değişken 'A' mevcut blokta zaten bildirilmiş" şeklinde bir hata gösterilecektir.

2. ve 3. örnek için, "'Genel Alt b ()' aynı imzalara sahip birden fazla tanıma sahip" şeklinde bir hata gösterilecektir. ve "'Public Function c () As Integer' aynı imzalara sahip birden çok tanıma sahiptir.", sırasıyla.

Bu hatalardan, hataların değişkenler ve prosedürler / işlevler için farklı konumlara atıldığına dikkat edin. Değişkenler için, hata 2. bildirimde, prosedürler / işlevler için 1. bildirimde / aynı kodun tanımında atılır.

Yukarıdaki bir yorumda bir kullanıcının söylediği gibi, VB.NET kodu arka planda sürekli olarak kontrol edilir ve / veya düzeltilir; bu hatayı VS IDE'deki "Hata Listesi" penceresinde görebilirsiniz. Ve bu BİR HATA olduğundan ve BİR UYARI DEĞİLDİR , hata çözülene kadar kod derlenmeyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.