Soru VB.net'de hiçbir arttırma operatörü yok


Ben tamamen vb.net için yeni ve C # VB.net için bir döngü dönüştürürken bu konuda geldi Artırıcı işleçlerin vb.net (++ ve -) olarak mevcut olmadığını fark ettim oysa ben böyle bir şey yapabildi cnt +=1

Biraz araştırdım ve karşılaştım Eric'in Mesajı aynı, ama tam olarak bunu anlamak mümkün değildi. O bahseder VB'de, bir İfade sadece bir ifade olamaz. Bunun gerçekten nasıl olduğuna emin değilim.

Umarım buradaki bir kimse bunun neden C # ile aynı şekilde çalışmadığını açıklayabilir. (Umarım bu da neden sahip olduğumuza göre geçerlidir. == karşılaştırma için C #


25
2018-06-14 05:24


Menşei


-1, Başka bir VB.NET bashing oturumu gibi görünüyor? - Predator
@Gens Bu bir bash değil, neden sadece ilgileniyorum - V4Vendetta
Neden bağlandığınız makalede açıklanmaktadır. Bundan daha fazla yaklaşacağını sanmıyorum. - Sven
Python da aynı şekilde. Temel olarak, daha kolay, ayrıştırmak için kod sağlar ve şifreli tek linerler veya beklenmedik davranışları önler. - James O'Doherty


Cevaplar:


Dil tasarımcılarının bunu düşündüğünü söyleyebilirim. BASIC daha iyi bir başlangıçtı C tasarlarken Visual BASIC. Soyunu takip edebilirsiniz C (ve daha önce, BCPL) vasitasiyla C++, Java ve C#.

VB soy orijinalinden gelir BASIC Dartmouth'dan (ve daha önce, Fortran) ve tamamen farklı bir canavardır.

Başka bir deyişle, saygıdeğer olan şey BASIC:

LET I = I + 1

Muhtemelen saldırıya uğradı ve yok edildi yeterli :-)

Eric'in emrine göre, i++; aslında sadece bir ifade, bir veren i yan etkisi ile i etkinlikten sonra artar (i++; yan etki olmayan ifade gibi bir ifadedir i;).

O yüzden C bu çıplak ifadelere bile izin verir 42; Bu gerçekten çok fazla değil, ama kesinlikle geçerli. Diğer bir deyişle, aşağıdaki tamamlandı C Program:

int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }

Bütün bu ifadeler geçerli ama işe yaramaz.

İçinde BASICBu gerçekten bitmedi çünkü BASIC oluşmuş ifadeleri (bir şey yapan şeyler). Bu yüzden i += 1 (artan bir ifade i) koşer olarak kabul edilir ama i++ (sadece bir artışa neden olan bir yan etkisi olan hiçbir şey yapmadan bir ifade i) değil. Sadece semantik saç parçalama olduğunu ve şüphesiz ki VB tasarımcıları tartıştı.

Ama günü kazanan grup "biz stinkinlere ihtiyacımız yok" C sevgili dilimizde "grup.

Küçük merciller için minnettar olmalısınız, en azından COBOL ile uğraşmak zorunda değilsiniz:

ADD 1 TO DD_WS_I.

32
2018-06-14 05:45



tamam .. İfadeyle ilgili ifadenin neden ilgili olduğunu vurgulayabilir misiniz? (Üzgünüm, VB'nin çok önemsiz bir bilgisine sahibim, lütfen VB geçmişinden hiçbir şeyim yoksa lütfen öneride bulunun) - V4Vendetta
Doğru COBOL olurdu ADD 1 TO DD_WS_I. - John Saunders
Bu soruya nasıl karşı çıktığımı tam olarak bilmiyorum ama büyük bir cevap. - basher
WS-VAL-01'yi WS-VAL-DD VEREN WS-VAL-DD-NEW'e Kesinlikle Ekleyin. Veya daha da iyisi, BİLGİSAYAR ... YAŞAM - David Shields


Çünkü tasarımcılar bunu düşündü i++ sahip olduğunuzda gereksizdir i += 1.

For döngülerden birine gerek yok, yani hiçbir şey kaybetmezsiniz.

Görsel Temel Sonuçta ... neden karmaşık hale getiriyorsun?


7
2018-06-14 05:38



ve onlar C # diye düşünmediler mi? - V4Vendetta
@ V4Vendetta: Hayır, çünkü C / C ++ ile benzer şekilde tasarlanmıştır. - Mehrdad


@Paxdiablo'nın dediği gibi, VB'de (ya da daha doğrusu atalarının BASIC'sinde), her şey bir Beyan. Ve aslında, her ifade bir anahtar kelime ile tanıtıldı.

Yani bir değişken atamak için

LET x = x + 1

ve bir yöntemi çağırmak için

CALL SomeMethod

VB’de LET ve CALL Nihayet tamamen gereksiz olduğundan ve netlik eklemediği için (bir özel durumda hariç) bırakılmıştır. Ancak, VB'nin temel sözcük dilbilgisi bu kadar fazla değişmedi: her bir açıklama hala bir Beyan. i++ VB'de bir işlev değil, bir işlev çağrısı veya bir ödevi yoktur.

VB.NET'in ilk sürümünde C # gibi ön ve son artırma operatörlerini tanıtmak için bir argüman vardı. Oldukça basit bir sebepten dolayı, bunun yapılmasına karar verildi: ifadelerde yan etkilerin kullanılması önerilmemektedir. Genelde netliğin acı çekmesine izin verir. Hatta C # meşru kullanımları i++  bir ifadede çok nadir ve meşru kullanımlar ++i hala daha nadir (bazı durumlarda bunu inkar etmeme rağmen ekler berraklık).

Çoğu durumda kullanabilirsiniz i += 1 sadece iyi ve bu gayet iyi niyetle ifade eder.

C ++ 'da durumun temelde farklı olduğuna dikkat edin çünkü değil C #!) i++ aslında bir farklı anlamsal göre i += 1 operatörün aşırı yüklenmesi nedeniyle (C # 'da ayrıca operatör aşırı yüklenme var ama ++ aşırı yüklenemez).


6
2018-06-14 06:34





VB'de ifade ve ifade arasındaki farkın bir örneği olarak, VB'de, aşağıdakilerden beri bir derleyici hatası oluşturur count += 1 artışlarla count 1, ama tüm ifade count += 1 bir sonuç döndürmez, bu nedenle bir parametre olarak kullanılamaz.

Dim count As Integer = 0
Console.WriteLine(count += 1)  ' compiler error

Bunun yerine bunu yapmak zorundasın

Dim count As Integer = 0
count += 1
Console.Writeline(count)

Tabii ki aynı şey += String üzerinde operatör.

"VB'de, bir ifade sadece bir ifade olamaz" ne demektir?

  • VB derleyicisi bazı atamalarda veya başka bir işlemde tüketilmesi gereken sonuçları gerektirir.
  • Bu nedenle VB'de bir atama işlemi yapar değil sonuç üretmek. Eğer VB derleyicisi bir açıklama olarak tek başına durmasına izin vermezse (derleyici sonuçların tüketilmesini gerektirir).
  • Dolayısıyla VB'deki ödevler ifadeler olarak kullanılabilir, ancak ifadeler olarak kullanılamaz. Bu, bir atama ifadesini bir yönteme ya da bir ara sonuç olarak parametre olarak kullanamazsınız.
  • C # atama işlemi yapar bir değer üretmek. Böylece ödevlerin ifadeler olarak tek başına durması için derleyici değil Tüm sonuçların tüketilmesini gerektirir.
  • C # 'daki sonuç, bir sonuç üreten diğer herhangi bir işlemin bir ifade olarak tek başına durabilmesidir. 2 + 2 örneğin sonucu üretir 4 ve bir açıklama olarak tek başına durabilirken, VB'de bunu yapamaz.

"Neden ön ve sonrası artış operatörleri VB'de mevcut değil?"

count++ diyor, ilk değerini döndür count, sonra artım count (ve ödevin değerini count).
Bu durumda artırılmış değer kullanılmaz (artırmadan önceki değer kullanılır). Daha önce de belirtildiği gibi, VB derleyicisi, işlem değerlerini kullanmanızı veya atamanızı gerektirir.

++count diyor, ilk artım count, sonra ödevin değerini count.
Bu durumda, +1 atama değeri count ifadenin değeri olarak döndürülür. Daha önce de belirtildiği gibi, VB'deki ödevler sonuç üretmemektedir.
Dolayısıyla, bu operatörleri VB'de uygulayan ciddi bir ağrı olacaktır.


4
2017-07-26 17:58





Aşağıdaki uzantı yöntemleri çoğaltılır ++x  x++  --x  x--

Public Module INC_DEC

  <Runtime.CompilerServices.Extension>
  Public Function PreINC(ByRef x As Integer) As Integer
    Return Interlocked.Increment(x)
  End Function

  <Runtime.CompilerServices.Extension>
  Public Function PostINC(ByRef x As Integer) As Integer
    Dim tmp = x
    Interlocked.Increment(x)
    Return tmp
  End Function

  <Runtime.CompilerServices.Extension>
  Public Function PreDEC(ByRef x As Integer) As Integer
    Return Interlocked.Decrement(x)
  End Function

  <Runtime.CompilerServices.Extension>
  Public Function PostDEC(ByRef x As Integer) As Integer
    Dim tmp = x
    Interlocked.Decrement(x)
    Return tmp 
  End Function
End Module

3



VB.net'de yeni favori iğrençlik. Bugün gülmek için @AdapSpeight teşekkürler! - JJS