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.io — BoundParenthesized 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 = NULL — NULL , 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 . , . , . .

Source: https://habr.com/ru/post/J445580/


All Articles