VB.NETとC#の違いの完全なリスト。 パート2

記事の最初の部分では、TIOBEの評価の観点からC#に対するVB.NETの優位性のトピックで、コメントに活発な反応が見つかりました。 したがって、 AngReloadアドバイス に従って、 StackOverflowの傾向を見てみましょう。



C#はまだ強い! 長い間話されていた革命はキャンセルされました! ほら、仲間! かどうか? TIOBE評価は検索エンジンクエリに基づいており、SO評価は質問された質問のタグに基づいています。 おそらく、VB.NETの開発者は、専門性のない多くの人々を含めて、単にStackOverflowの存在を知らないのでしょうか? または、Google、またはBingを介してそこにたどり着いたのに、質問の仕方が分からないのですか または、十分なMiscrosoftのドキュメントがあり、いくつかの質問はすべて回答済みです。



いずれにしても、VB.NETのシェアは目立って安定していますが、ボリュームに関しては第一位ではありません。 そして、もちろん、そのような結果はデザイナーと言語開発者の強力なチームなしでは不可能でした。 以下は、このチームのメンバーAnthony Greenによる記事の翻訳の2番目の部分です。



内容



非表示のテキスト

コンバージョン数





表現





コンバージョン数



34.ブール変換



Boolean True



を符号付き数値型に変換すると-1



生成され、符号なし型に変換するとこの型の最大値が得られますが、C#ではこのような変換はありません。 ただし、 Convert.ToInt32



メソッドは、たとえばTrue



1



に変換するため、 IL



最も頻繁に表現されます。 逆方向では、 0



以外の0



True



変換されTrue







なんで? VBが-1



から1



を使用することを好む理由は、すべての言語でビット単位の0(すべてのビットが0に設定される)の否定が-1



(すべてのビットが1



設定される)であるため、この値を使用すると論理的およびビット単位が組み合わされるためですAnd



Or



Xor



などの操作。

「True」および「False」行との間の変換もサポートされています(もちろん、大文字と小文字は区別されません)。



35. Option StrictがOnに設定されている場合でも、Enumタイプ間およびEnumタイプとそのベースタイプ間の変換は完全に無制限です。



哲学的な観点から、言語は基本的な整数型の名前付き定数のセットとしてではなく、 Enum



型を参照します。 これが最も明白な場所は平等です。 整数を列挙値と比較することは常に許可されますが、C#ではこれはエラーになります。



ストーリータイム: Roslyn APIは多くの内部改訂を経ています。 しかし、それらのそれぞれで、各言語にSyntaxKind



列挙が割り当てられ、ノードがどの構文を表すかがIfStatement



ます(例えば、 IfStatement



TryCastExpression



)。 開発者は言語から抽象化しようとするAPIを使用し、 SyntaxKind



値の1つをInteger



としてのみSyntaxKind



、生のInteger



SyntaxKind



比較するときにエラーを受け取らず、この開発者はすぐに私のオフィスに来て、不満を言いました: 実装の詳細については、キャストを強制する必要がありました!」



数年後、APIの次の改訂時に、言語固有の型を指すプロパティ( Property Kind As SyntaxKind



)を完全に削除し、すべてのAPIがInteger



を返し始めました。 すべてのC#コードが破損し、すべてのVBコードは何も起こらなかったかのように機能し続けました。



少し後に、このプロパティの名前をRawKind



に変更し、言語固有の拡張メソッドKind()



を追加することにしました。 メソッドを呼び出すために括弧が必要だったため、すべてのC#コードが壊れましたが、VBでは必要なかったため、すべてのVBコードは、何も起こらなかったかのように再び機能し続けました。



36.整数演算のオーバーフロー/負のオーバーフローのチェックは、コンパイル環境(プロジェクト設定)によって完全に制御されますが、VBとC#は異なるデフォルト値を使用します。 VBでは、オーバーフローチェックはデフォルトで有効になっています



整数型には範囲があるため、たとえば、 Byte



は0〜255の値を表すことができます。 Byte



1をByte



255に追加するとどうなりますか。 オーバーフロー/アンダーフローが無効な場合、値は0にスクロールします。型が符号付きの場合、負の最小数(たとえば、 SByte



-128)にスクロールします。 これはおそらく、プログラムのエラーを示しています。 オーバーフロー/アンダーフローのチェックが有効になっている場合、例外がスローされます。 意味を理解するために、この無害なFor



ループを見てください。



 Module Program Sub Main() For i As Byte = 0 To 255 Console.WriteLine(i) Next End Sub End Module
      
      





githubソースコード



デフォルトでは、このループはVBで例外をスローします(ループの最後の反復がByte



境界を超えるためです。ただし、オーバーフローチェックをオフにすると、255 iが再び0になるためループします。

アンダーフローは、そのタイプの最小値を下回ると最大値になるという反対の状況です。



より一般的なオーバーフローの状況は、単純に2つの数字を加算することです。 両方ともByte



として130と150の番号をByte



ます。 それらを合計すると、答えは280になり、Byteに収まりません。 しかし、プロセッサはこれを認識しません。 代わりに、彼は答えが24だと報告しています。



ところで、これは変換とは関係ありません。 2バイトを追加すると1バイトになります。 これは、バイナリ数学の機能です。 ただし、LongからIntegerへの変換を試みる場合など、変換を実行することでオーバーフローが発生することもあります。 オーバーフローをチェックせずに、プログラムはこの変数に収まる範囲で余分なビットやスタッフをカットします。



違いは何ですか? パフォーマンス。 CLRのオーバーフローをチェックするには、他のすべてのセキュリティチェックと同様に、非チェックオプションに比べて計算時間が少し長くなります。 VBは、開発者の生産性が計算パフォーマンスよりも重要であるという哲学に基づいているため、デフォルトではセキュリティチェックが有効になっています。 今日のC#開発チームはプロジェクトのデフォルト設定について異なる決定を下すかもしれませんが、最初のC#開発者はC / C ++開発者から来たことを考えると、このグループの人々はおそらくコードがこれ以上何もしないことを要求し、プロセッササイクルを犠牲にする可能性があります; これは難しい哲学的な違いです。



ニュアンス:オーバーフロー/アンダーフローチェックがオフになっている場合でも、 Single



またはDouble



PositiveInfinity



NegativeInfinity



NaN



からDecimal



への変換は例外Decimal



スローします。これらの値は原則としてDecimalで表現できないためです。



37.浮動小数点数を整数型に変換するには、切り捨てるのではなく、バンカーの丸めを使用します



VBで1.7を整数に変換すると、結果は2になります。C#では、結果は1になります。アメリカ以外の数学的規則については何も言えませんが、実数から整数に切り替えると、本能的に丸められます。 そして、プログラマーのサークルの外で私が知っている人は誰も、1.7に最も近い整数が1であるとは考えていません。



実際には、いくつかの丸め方法があり、VB(およびMath.Roundメソッド)で使用される丸めの種類は、デフォルトで銀行の丸めまたは統計家の丸めと呼ばれます。 その本質は、2つの整数の中間の数値に対して、VBは最も近い偶数に丸めることです。 1.5は2に丸められ、4.5は4に丸められます。学校で教えられたように実際に機能しないのは、0.5から切り上げるように教えられました(技術的には、ゼロから横に丸める)。 しかし、その名前が示すように、銀行の丸めには、多数の計算を使用して、半分に丸めるときに分割し、常にお金を渡したり、常にお金を維持したりしないという利点があります。 つまり、大規模なセットでは、これによりデータの歪みが最終的な統計偏差に制限されます。



違いはどこから来ますか? 丸めはより直感的で実用的であり、切り捨てが速くなります。 LOBアプリケーション、特にVBAで実行されるExcelマクロなどのアプリケーションでVBを使用することを検討する場合、単に小数点以下の桁を削除すると問題が発生する可能性があります。



変換の方法は常に物議を醸す問題であり、明示的に示す必要があることは明らかだと思いますが、1つを選択する必要がある場合は...



38. NotInheritableクラスを、コンパイル時に実装しないインターフェースとの間で変換することは間違いではありません。



一般的に、インターフェイス実装のNonInheritableクラスをチェックしている場合、このタイプとそのすべての基本タイプのすべてのインターフェイスを知っているため、コンパイル時にそのような変換が可能かどうかを理解できます。 型が継承される場合、そのような変換が不可能であることを確信することはできません。なぜなら、それによって参照されるランタイムオブジェクトの型は、実際にこのインターフェイスを実装するより派生した型を持っているからです。 ただし、COM相互運用機能に起因する例外があります。コンパイル時に、型がインターフェイスに関係していることが表示されない場合がありますが、実行時には表示されます。 このため、このような場合、VBコンパイラは警告を生成します。



なんで? VBとCOMは、古い近所の子供の頃一緒に育ちました。 そのため、言語設計には、VBが.NET 1.0のリリース時にCOMにのみ存在していたものに多大な注意を払ういくつかのソリューションがあります。



39. nullを意味のある型にアンパック(アンボックス)しようとすると、NullReferenceExceptionではなくデフォルトの型の値が発生します。



技術的にはこれは参照型にも当てはまると思いますが、そうです:

 CInt(CObj(Nothing)) = 0
      
      





なんで? CInt(Nothing) = 0



であり、変数を入力したかどうかに関係なく、言語はある程度一貫している傾向があります。 これは、組み込みの意味のある型だけでなく、あらゆる構造に​​適用されます。 詳細については、#25根拠を参照してください。



40.ボックス化解除はプリミティブ型の変換をサポートします



VBとC#の両方で、 Short



Integer



に変換できますが、パックされたShort



Integer



に変換しようとするとどうなりますか? VBでは、 Short



は最初にアンパックされ、次にInteger



変換されます。 C#では、 int



に変換する前にshortを手動でアンパックしない限り、 InvalidCastException



がスローされます。

これは、すべての内部変換、つまりパック数値型、文字列と数値型の間の変換、文字列と日付(はい、10進数、および日付はプリミティブ型です)に適用されます。



なんで? 繰り返しますが、一貫した動作を確保するために、プログラムが完全に型付けされているか、Objectとして型付けされているか、あるオプションから別のオプションにリファクタリングされているかどうか。 上記の#39を参照してください。



41. String



Char



間には変換があります





私以外の誰もVBの文字リテラルの構文を覚えていないので(覚えてはいけません)。



42. String



Char



配列の間には変換があります





明確にするために、これらの変換は新しいオブジェクトを作成しますが、内部のString



構造にはアクセスできません。



面白い話: .NET 3.5と4.0の間のString.Join



な変更を見つけた(または報告して、調査していた)のは、.NETチームが2番目のString.Join



オーバーロードString.Join



ParamArray



修飾子を追加したためです。 。 正確な仮定は時間の経過とともに失われます(おそらく良い方向に)が、信じているように、 ParamArray



修飾子を使用すると、 Char



配列を文字列に変換し、別の要素としてパラメーター配列に渡すことができるようになりました。 楽しいテーマ。



43および44。文字列から数値型および日付型への変換は、リテラル構文をサポートします(通常)





これはベースプレフィックスで機能し、16進数(または8進数)入力をCInt("&H" & input)



に変換する非常に便利な方法を使用できるようにします。 残念ながら、VBランタイムはバイナリプレフィックス&Bまたは1_000



桁のグループ1_000



をサポートするように更新されていないため、この執筆時点でこの対称性は低下していますが、これは次のバージョンで修正されることを願っています。 科学表記法は機能しますが、タイプサフィックスがなく、日付変換も標準の日付形式をサポートするため、ISO-8601で使用されるJSON形式も機能しCDate("2012-03-19T07: 22Z") = #3/19/2012 02:22:00 AM#







なんで? 便利さ以外の理由は知りません。 しかし、#FF、U + FF、0xFFなど、今日のネットワークでほぼどこにでもある他の一般的な形式のサポートを提供したいと思います。 これにより、ある種のアプリケーションでの生活が大いに楽になると思います...



45. Char



型と整数型の間の変換はありChar





何?!?!?

これらすべての追加の変換について読んだ後、あなたは驚きましたか? VBはChar



Integer



間の変換を禁止します:





なんで? 何が起こるかは明確ではありません。 通常、このような状況でVBは実用的かつ/または直感的なアプローチを使用しますが、 CInt("1")



を表現するために、読者の半分は数字1(文字値1)を期待し、半分は数字49(ASCII / UTFコード文字1)。 半分のケースで誤った選択をする代わりに、VBには、文字をASCII / Unicodeコードに、およびその逆にChrW



それぞれAscW



ChrW



変換するための特別な機能がChrW



ます。



表現



46.何もない<> null



VBのリテラルNothing



nullを意味しません。 これは「使用される型のデフォルト値」を意味し、参照型の場合、デフォルト値はnullになります。 違いは、次の状況で使用する場合にのみ重要です。



  1. 何も重要​​なタイプを取りません、そして...
  2. 彼がこれをしていることは、文脈から明らかではありません。


これが何を意味するかを説明するいくつかの例を見てみましょう。



1つ目は、少し奇妙かもしれませんが、このプログラムが「True」を出力するという理解にほとんどの人が感動することはないと思います。



 Module Program Sub Main() Dim i As Integer = 0 If i = Nothing Then Console.WriteLine("True") End If End Sub End Module
      
      





githubソースコード



その理由は非常に簡単です。 Integer (0)



をそのタイプのデフォルト値Integer (0)



と比較しています。 この問題は、Null許容の意味のある型を追加するとVB2005 / 2008で発生します。 この例を見てください:



  Module Program Sub Main() Dim i = If(False, 1, Nothing) End Sub End Module
      
      





githubソースコード



タイプi



Integer?



ことをどのように提案できInteger?



Nullable(Of Integer)



)。 しかし、これはそうではありません。 Nothing



コンテキストから型を取得せず、このコンテキストの唯一の型は第2オペランドから取得され、これは単純なnon-nullable Integer



(技術的には、 Nothing



には型がありNothing



ん)。 この問題を見るもう1つの方法は、次の例です。



 Module Program Sub Main() M(Nothing) End Sub Sub M(i As Integer) Console.WriteLine("Non-nullable") End Sub Sub M(i As Integer?) Console.WriteLine("Nullable") End Sub End Module
      
      





githubソースコード



繰り返しになりますが、ここでは直感的に、 Nothing



は「nullable」ヒントを追加し、言語はnullable



を受け入れるオーバーロードを選択しますが、そうではありません(「 non-nullable



」は「最も具体的」なので選択します)。 少なくとも、C#のnullのように、式Nothing



Integer



はまったく適用されず、例外メソッドによってnullableオーバーロードが選択されると仮定できますが、これはNothing = null (Is null?)



という誤った考えに基づいていNothing = null (Is null?)







Nuance: VBのNothing



に一致する新しいdefault



式がC#7.1に追加されました。 null



代わりにdefault



を使用してC#で上記の3つの例をすべて書き換えると、まったく同じ動作になります。



これについて何ができますか? いくつかの提案がありますが、まだ勝者はいません。





コメントやTwitterであなたの意見を聞きたいです。



要約すると:





VBは、 Null



式(または同等のもの)の追加に抵抗し続けています。理由は次のとおりです。





そのようなもの。



オフトピック(関連する)



上記の2番目の例と非常によく似ていますが、型の推論はありません。



 Module Program Sub Main() Dim i As Integer? = If(False, 1, Nothing) Console.WriteLine(i) End Sub End Module
      
      





githubソースコード



このプログラムは0を表示します。同じ理由で2番目の例とまったく同じように動作しますが、関連していても別の問題を示しています。 直感的に、 Dim i as Integer? = If(False, 1, Nothing)



Dim i as Integer? = If(False, 1, Nothing)



Dim i As Integer? : If False Then i = 1 Else i = Nothing



と同じように動作するDim i as Integer? = If(False, 1, Nothing)



Dim i As Integer? : If False Then i = 1 Else i = Nothing



Dim i As Integer? : If False Then i = 1 Else i = Nothing



。 この場合、条件式(If)



は最終型の情報をオペランドに「パススルー」しないため、これはそうではありません。 これにより、最終的な(コンテキスト)タイピング( Nothing



AddressOf



、リテラルの配列、ラムダ式、および補間された文字列)と呼ばれるものに依存するVBのすべての式が、一般的な非コンパイルから静かに誤った値の作成に至るまでの問題に分解されることがAddressOf



ます大声で例外をスローします。 コンパイルされていないオプションの例を次に示します。



 Module Program Sub Main() Dim i As Integer? = If(False, 1, Nothing) Console.WriteLine(i) Dim operation As Func(Of Integer, Integer, Integer) = If(True, AddressOf Add, AddressOf Subtract) End Sub Function Add(left As Integer, right As Integer) As Integer Return left + right End Function Function Subtract(left As Integer, right As Integer) As Integer Return left - right End Function End Module
      
      





githubソースコード



このプログラムはコンパイルされません。 代わりに、両方のAddressOf



式がFunc(Of Integer, Integer, Integer)



デリゲートFunc(Of Integer, Integer, Integer)



を受信することをAddressOf



意図している場合、式のタイプを判別できないというエラーをIf



式で報告します。



, Nothing



null (), Nothing



nullability



() If(,,)



Nothing



( ) () — , .



47. ;



«3»:



 Module Program Sub Main() Dim i As Integer = 3 M((i)) Console.WriteLine(i) End Sub Sub M(ByRef variable As Integer) variable = -variable End Sub End Module
      
      





GitHub



C# «-3». , VB — , . , M(3)



, M(i)



, i



, . C# ( ) , M .



なんで? VB . Quick Basic (Copyright 1985), . , 2002 , .



№1: « » , Visual Basic .NET.

№2: Roslyn ( , ( ) ( )), : . C# , ((a + b) * c a + (b * c))



. , C#, C++, , , , . : « VB?» « C#?» source.roslyn.ioBoundParenthesized



VB C#. , , .



48. Me





VB.NET Me



. , - , — , Me Structure . Me . C# this



, this



.



49.



VB, , :



 Class C Sub M() Extension() End Sub End Class Module Program Sub Main() End Sub <Runtime.CompilerServices.Extension> Sub Extension(c As C) End Sub End Module
      
      





GitHub



C# ( something.Extension). , C#, , this.Extension()



.



なんで? , 'Me.'



, , , , . VB.NET . , .



50. (Static imports will not merge method groups)



VB « » (Java-, C# VB). , Imports System.Console



WriteLine()



. 2015 C# . VB Shared- , System.Console



System.Diagnostics.Debug



, WriteLine



, . C# , , .



なんで? , , VB , C# ( ). , ( , ), … , .



, VB , VB , , , , , ( #6 ). VB . , VB 2002 .



51 52. (Partial-name qualification & Smart-name resolution)



:





, , . . VB Imports , using



C# .



, VB System



, System



, System



. , . , ExtensionAttribute



, <Runtime.CompilerServices.Extension>



<System.Runtime.CompilerServices.Extension>



.



C# . using System



System.Threading



Threading



.



, C# , . , System



, System.Threading



Threading



. , , , , .



, , VB, C# , Imports



/ using



, C# using , , using .



(Quantum Namespaces) ( )



, ! VB , . , System



ComponentModel



System.Windows.Forms



ComponentModel



? ComponentModel



. , ComponentModel.PropertyChangedEventArgs



, ( , ). System.Windows.Forms



(, , , , ), (ambiguity errors).



VB2015 (Smart Name Resolution), System



System.Windows.Forms



ComponentModel



, , System.ComponentModel



System.Windows.Forms.ComponentModel



, . , , , , . , , , .. ComponentModel.PropertyChangedEventArgs





System.ComponentModel.PropertyChangedEventArgs



, System.Windows.Forms.ComponentModel.PropertyChangedEventArgs



. , .



, Windows



, ( ) ( ) ( ). WinForms/WPF



UWP



.



53. Add



#33 , VB - , . , , — , :



 Class Contact Property Name As String Property FavoriteFood As String End Class Module Program Sub Main() Dim contacts = New List(Of Contact) From { {"Leo", "Chocolate"}, {"Donnie", "Bananas"}, {"Raph", "The Blood of his Enemies"}, {"Mikey", "Pizza"} } End Sub <Runtime.CompilerServices.Extension> Sub Add(collection As ICollection(Of Contact), name As String, favoriteFood As String) collection.Add(New Contact With {.Name = name, .FavoriteFood = favoriteFood}) End Sub End Module
      
      





GitHub



C# , Roslyn C#, . , ( , ), VS2015.



54. ,



, VB Dim buffer(expression) As Byte



Dim buffer = New Byte(expression) {}



expression + 1



.



Microsoft BASIC, DIM



( dimension — ). , , , : 0 expression. Microsoft BASIC 1 ( , 1984), ( ), 2002 .



, - , , VB , BASIC C , , C, C- . , buffer(10)



0 10, 9!



55. VB - , C#



, . , VB ( ) , — . :





, , VB , C#. , :





:





( ):





, IList(Of T)



, IReadOnlyList(Of T)



, ICollection(Of T)



, IReadOnlyCollection(Of T)



IEnumerable(Of T)



, , , ParamArray IEnumerable



.



なんで? , VB. , . 2008 VB C# «» {}, - ( , , ). , , , + , . .



56.



, LINQ. , .



, , .



57. CType, DirectCast C#



/ VB C#.

VB CType



:





VB DirectCast



:





C# — (Type)expression



:





CType



C# , . , . VB C# , IL . , C#, , . .



, CType



, (, ). CType



, DirectCast



, . , , IL : Object



( ValueType



) CLR «unbox» VB-, , (, Short



Integer



). , , C#. . , .



なんで? . , , , , .



58. «»



, , 5 Mod 2 * 3



5 VB, «» C# 5 % 2 * 3



3.



, , . , (, (\) VB), , , . !



59. ; + & ; + VB <> + C#



, + () & () VB + C#.

String



:


VB





C#





, + &

VB





C#





:

VB





C#





String Enum:

VB





C#





: , + VB, - . + , , - . なんで? なぜなら:





. — .



: +, . , &, , ( , ). , , .



60. : 3 / 2 = 1,5



— : « ?» . «». : « . ?»

VB C#.



C, , , « 5 9?» , \. , , , , 0 ( , - INumeric



).



61. ^ Math.Pow





Math.Pow



. , . , ( custom



) ( , System.Numerics.BigInteger



).



: F# **, VB F# : op_Exponent



op_Exponentiation



. F# Pow



. . , .



62. =/<> /



C# '==' () , , ( ). VB . VB ( Is/IsNot



) .



: - Roslyn , . . . VB , = , C# , , , .



63. =/<> ( )



VB .



-, ( ) - ( ), , Option Compare Binary



Option Compare Text



. Option Compare Binary



, , VS.



( ), , API. それは:





:





, , : VB . , Option Compare



, «Empty».



 Module Program Sub Main() Dim s As String = Nothing If s = "" Then Console.WriteLine("Empty") End If End Sub End Module
      
      





GitHub



s = "" VB — String.IsNullOrEmpty(s)



.

, , , , , . , , .



なんで? Option Compare Text



, , . , , .

, , , , .



, , . , . , , (collation) SQL Server, . , VB VB6, VBA Office, Excel Access, VBScript Windows, -, -… . , , .NET API , Option Compare Text, . , .NET API, .



null, , . VB6 . String



"". , VB String



. VB, Left



Mid



, String



. null . Len(CStr(Nothing)) = 0



Left(CStr(Nothing)



, 5) = ""



, CStr(Nothing).Length



CStr(Nothing).Trim()



.



, ?



。 ( ).



:

, , , . ! VB , , "String A" = "String B"



, Microsoft.VisualBasic.CompilerServices.Operators.CompareString



, - , , . LINQ- . , VB ( ). , , - , . LINQ-to-SQL, LINQ-to-Entities , Microsoft. , VB , !



, C#, VB, LINQ . : 1) , VB , , 2) , VB , , LINQ-. , VB ().



: , « API». Option Compare



VB, InStr.Replace



Microsoft.VisualBasic.Strings



. , ?



, , , ? , , , : , , .



64. Nullable ( null )



VB C# - nullable. , (null-propagation).



SQL, , , null. , (, +), null, null. "?."



: obj?.Property obj



null, null, .



nullable , VB, C# . - : .



VB, nullable , null, null . 1 + null null null + null null. , (, = <>) C#:





VB ( nullable ) null null . Boolean



= Boolean?



, True



, False



null



. . C# non-nullable bool



, .



, . null. VB NULL = NULLNULL , TRUE.

, :



. Null , , , C# .



. C# VB, « null?» C# (if (value == null))



. VB , VB (=/<>) (Is/IsNot)



, VB Is Nothing



non-nullable Boolean



.



, VB null, null. And/AndAlso



Or/OrElse



.



Integer?



( ), VB, C# null, :





Boolean?



, VB .





, True/False



, , null.
, AndAlso



OrElse



.



C# (&&/||) (&/|) nullable boolean (bool?)



. , , non-nullable boolean nullable boolean .



?

VB , - :



 Imports System.ComponentModel Class BindableRange Implements INotifyPropertyChanged Property _EndDate As Date? Property EndDate As Date? Get Return _EndDate End Get Set(value As Date?) ' This line here: If value = _EndDate Then Return _EndDate = value RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(EndDate))) End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler _ Implements INotifyPropertyChanged.PropertyChanged End Class Module Program WithEvents Range As New BindableRange Sub Main() Range.EndDate = Today Range.EndDate = Today Range.EndDate = Nothing Range.EndDate = Nothing End Sub Private Sub BindableRange_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _ Handles Range.PropertyChanged Console.WriteLine(e.PropertyName & " changed.") End Sub End Module
      
      





GitHub



, , , , «EndDate change» . , , VB null ? , EndDate



, , , Nothing



.



VB : «, , . » :

 If value <> _EndDate Then _EndDate = value RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(EndDate))) End If
      
      





! . , non-nullable . , . , :

 If value Is Nothing AndAlso _EndDate Is Nothing Then Return If value <> _EndDate Then Return
      
      





?

, C# , VB. ( nullable , ), , null.



null — «» « » . .



null « » «» . , , : comparer, , comparer . Roslyn, Optional(Of T)



, , , null, , .



, NULL « », VB :





, , SQL- . , NULL SQL , NULL. . , , NULL . , . , , ( ). , , , , , NULL , SQL ( ).



VB. nullable 2008 , VB ?

LINQ to SQL



VB , , , , , , LINQ- . !



. SQL Server, , SET ANSI_NULLS OFF , SQL- C#, WHERE Column = NULL



. , , OFF ( ). SQL Server ( ) . : « ? . , - Option ANSI_NULLS Off VB.NET?» . :







, , , , , SQL Server, VB.

そのようなもの。



65. 1:1



, VB , , , . VB - , .



, , , , . VB , , , , , VB .



9.8.4 .



66. Function() a = b () => a = b



. , () => expression



C# Function() expression



VB. Function()



-, - , VB. a = b



, a



b



( Boolean



), b







. - (delegate relaxation) VB ( -) Sub- ( ). . () => a = b



C# VB — Sub() a = b



. — - , .



=, , . ( Sub



-) , ( Function



-) .



67. Async Function



async void





C# async



-, , , Task



void



, , Task



, .



VB.NET , .. void Async



Async Sub



, Task



Task(Of T)



Async Function



. , , VB, (relaxing) Task Async



void



. Async Sub



, , .



68. () VB



, VB:



 Class Foo 'Function [Select](Of T)(selector As Func(Of String, T)) As Foo ' Return Me 'End Function Function Where(predicate As Func(Of String, Boolean)) As Integer Return 0 End Function End Class Module Program Sub Main() Dim c As New Foo Dim q = From x In c Where True Select x End Sub End Module
      
      





GitHub



VB, C#. -, Foo



Select



, , Where



. Select



, , Select



, Integer



. C# , .Where



( Select



). , , .



LINQ API. , VB C#, . , C# , « », , , , . - , «» , , -.



, VB , , C# , .



, Roslyn, : « (range variables)?» « ?» . . , VB , Let



, C# — . , VB, C# 2012 , :



 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CSharpExamples { struct Point { public int X { get { return 0; } } public int Y { get { return 0; } } } class Foo { public IEnumerable<Point> Select<T>(Func<string, T> selector) { return new Point[0]; } } static class Program { static void Main(string[] args) { var c = new Foo(); var q = from X in c let Y = "" select Y.CompareTo(-1); } } }
      
      





GitHub



, — ? X, — string



. let



Y



, string. , Point, X



Y



, , int



X



Y



, «» . Y



select



, int



int



`, … .



, « ?» . VS2015 C# , «». , Roslyn C#, . , ( , ), - .



なんで? , , , . , , VB C# .



69 70. As



From



cast



; 'As'





( , …)



From x As Integer In y



VB, , from int x in y



C#.



-, C# , ( ) . .Cast<T>()



. VB , , , , .



-, , .Cast



( ). , , , .Cast



.Select



.



なんで? 手がかりはありません。 VB . , For Each x As T In collection



, As T



. From



As



For Each



( , As



).



71-75. Select



, ,



例:





なんで? ( Amanda Silver ). !





? , , - , , :



 Module Program Sub Main() Dim numbers = {1, 2, 3} ' BC36606: Range variable name cannot match the name of a member of the 'Object' class. Dim q = From n In numbers Select n.ToString() End Sub End Module
      
      





GitHub



BC36606: Range variable name cannot match the name of a member of the 'Object' class



BC30978: Range variable '…' hides a variable in an enclosing block or a range variable previously defined in the query expression



— , Object



, , , , . ( n.ToString()



), . , .



76+.



. … … . … 20-25 ( — .. ).



広告の分。 15-16 - .NET- DotNext 2019 Piter . , . , . .



All Articles