DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン こんな演算子初めて見ました。 /VBはじめました (19/11/25(Mon) 16:06) #34393
Nomalアイコン Re[1]: こんな演算子初めて見ました。 /魔界の仮面弁士 (19/11/25(Mon) 16:30) #34394
Nomalアイコン Re[1]: こんな演算子初めて見ました。 /魔界の仮面弁士 (19/11/25(Mon) 21:39) #34395
  └Nomalアイコン Re[2]: こんな演算子初めて見ました。 /VBはじめました (19/11/26(Tue) 09:49) #34396 1574729391.png/9KB
    ├Nomalアイコン Re[3]: こんな演算子初めて見ました。 /VBはじめました (19/11/26(Tue) 09:50) #34397 解決み!
    └Nomalアイコン Re[3]: こんな演算子初めて見ました。 /魔界の仮面弁士 (19/11/26(Tue) 12:20) #34399 解決み!


親記事 / ▼[ 34394 ] ▼[ 34395 ]
■34393 / 親階層)  こんな演算子初めて見ました。
□投稿者/ VBはじめました 一般人(22回)-(2019/11/25(Mon) 16:06:55)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    左外部結合の実行に載っていた次のコードに対しての質問です。
    https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-left-outer-joins
    
    (質問1)
    コメント@のKeyは、必要でしょうか?削除しても、同じ動作をしますが、動作を明示するためにわざわざつけた方がよいという意味でしょうか?
    
    (質問2)
    コメントAにある二項演算子で使われているものですが、VBに、こんな演算子ってありましたけ?subpet?.Name
    ビルドすると問題なく動作します。
    
    注:このコードは、C#→VBの変換をWebで行ったものを整理したものです。
    
    詳しい方いらっしゃいましたら、教えて頂けないでしょうか?
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim magnus As Person =
                New Person With {.FirstName = "Magnus", .LastName = "Hedlund"}
            Dim terry As Person =
                New Person With {.FirstName = "Terry", .LastName = "Adams"}
            Dim charlotte As Person =
                New Person With {.FirstName = "Charlotte", .LastName = "Weiss"}
            Dim arlene As Person =
                New Person With {.FirstName = "Arlene", .LastName = "Huff"}
    
            Dim barley As Pet =
                New Pet With {.Name = "Barley", .Owner =
                    terry}
            Dim boots As Pet =
                New Pet With {.Name = "Boots", .Owner =
                    terry}
            Dim whiskers As Pet =
                New Pet With {.Name = "Whiskers", .Owner =
                    charlotte}
            Dim bluemoon As Pet =
                New Pet With {.Name = "Blue Moon", .Owner =
                    terry}
            Dim daisy As Pet =
                New Pet With {.Name = "Daisy", .Owner =
                    magnus}
    
            Dim people2 As List(Of Person) =
                New List(Of Person) From {
                    magnus,
                    terry,
                    charlotte,
                    arlene}
            Dim pets2 As List(Of Pet) =
                New List(Of Pet) From {
                    barley,
                    boots,
                    whiskers,
                    bluemoon,
                    daisy}
    
            Dim query = From person In people2
                        Group Join pet In pets2
                            On person Equals pet.Owner
                            Into gj = Group
                        From subpet In gj.DefaultIfEmpty()
                        Select New With {
                            person.FirstName,
                           Key .PetName = '@
                            If(subpet?.Name, String.Empty)} 'A
    
            For Each v In query
                Console.WriteLine($"{v.FirstName & ":"}{v.PetName}")
            Next
            'OutPut:
            'Magnus: daisy
            'Terry:  barley
            'Terry:  boots
            'Terry:  Blue Moon
            'Charlotte: whiskers
            'Arlene:
        End Sub
    
        Class Person
            Public Property FirstName As String
            Public Property LastName As String
        End Class
    
        Class Pet
            Public Property Name As String
            Public Property Owner As Person
        End Class
    
    End Class
    

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34393 ] / 返信無し
■34394 / 1階層)  Re[1]: こんな演算子初めて見ました。
□投稿者/ 魔界の仮面弁士 大御所(1261回)-(2019/11/25(Mon) 16:30:19)
  • アイコンNo34393に返信(VBはじめましたさんの記事)
    > (質問1)
    > コメント@のKeyは、必要でしょうか?
    > Key .PetName = '@

    匿名型における Key の役割は、前回の回答 No34387 で述べております。



    > 削除しても、同じ動作をしますが、

    For Each で列挙して、v.PetName を出力していますが、
    Key が付いている場合は、PetName が ReadOnly となり、
    Key が付いていない場合は Writable となります。
    (ちなみに C# の匿名型は、常に readonly です)


    また、Key メンバーは匿名型同士の比較処理においても使われます。
    https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/objects-and-classes/anonymous-types?WT.mc_id=DT-MVP-8907


    > (質問2)
    > コメントAにある二項演算子で使われているものですが、VBに、こんな演算子ってありましたけ?subpet?.Name

    二項演算子 `If` は、Visual Basic 2008 (VB8.0)からサポートされました。
    Null 条件演算子 `?.` は、Visual Basic 2015 (VB14.0) からのサポートです。

    https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/null-conditional-operators?WT.mc_id=DT-MVP-8907
違反を報告
[ 親 34393 / □ Tree ] 返信 削除キー/

▲[ 34393 ] / ▼[ 34396 ]
■34395 / 1階層)  Re[1]: こんな演算子初めて見ました。
□投稿者/ 魔界の仮面弁士 大御所(1262回)-(2019/11/25(Mon) 21:39:07)
  • アイコンNo34393に返信(VBはじめましたさんの記事)
    > 動作を明示するためにわざわざつけた方がよいという意味でしょうか?
    言語仕様の観点で言えば、C# の匿名型を Visual Basic での実装へと
    「直訳」した場合には、すべてのプロパティに対して Key が付与されます。

    一方、機械的に翻訳するのではなく、コードの意図を読み取った上で
    「意訳」する場合には、Key を付与すべきかどうかを個別に判断してください。


    その項目が比較用のキーとして使いたい場合には Key を付与し、
    編集可能な項目として利用したい場合には Key は付けずに記述します。
    (どちらでも無い場合、Key を付与するかどうかは任意です)


    参考までに、Key の有無によって動作が変化するような
    VB のサンプルを挙げておきます。
    https://karuakun.wordpress.com/2014/01/10/


    > 左外部結合の実行に載っていた次のコードに対しての質問です。
    > https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-left-outer-joins
    > 注:このコードは、C#→VBの変換をWebで行ったものを整理したものです。

    VB の匿名型と C# の匿名型は仕様が異なるので、変換ツールによって
    解釈の違いが生じるのは致し方無いところですね。


    [FirstName も PetName も Key なしで変換されるツール]
     https://codeconverter.icsharpcode.net/

    [FirstName は Key なし、PetName は Key ありに変換されるツール]
     http://converter.telerik.com/



    > VBに、こんな演算子ってありましたけ?
    参考までに:

    【Visual Basic の新機能】※VB2015(14.0)〜VB2019(16.0)
    https://docs.microsoft.com/ja-jp/dotnet/visual-basic/getting-started/whats-new?WT.mc_id=DT-MVP-8907
違反を報告
[ 親 34393 / □ Tree ] 返信 削除キー/

▲[ 34395 ] / ▼[ 34397 ] ▼[ 34399 ]
■34396 / 2階層)  Re[2]: こんな演算子初めて見ました。
□投稿者/ VBはじめました 一般人(23回)-(2019/11/26(Tue) 09:49:51)
  • アイコン魔界の仮面弁士さん
    いつもお世話になっております。

    Keyについては、前回教えて頂いたことを踏まえて、ワザワザつける必要があるのか?付けることがマナーなのか?と疑問に感じたのと、LINQでGroup句を使用すると勝手に名前に[Key]って使われるので、また別の意味があるのかな?って思って質問させて頂きました。添付ファイル参照

    Null条件演算子については、手元の資料「独習 VisualBasic2010」でも調べて、ネットでもググって引っかからなかったので、質問させて頂きました。
    演算子って基礎事項と思っていたので、増えるという発想が無かったです。
    VBAからVisualBasic2005に移行する時は、一通り入門書を読んだのですが、知っていると思い込んでいる部分は、斜め読みをしていました。
    今回、Null条件演算子について教えて頂いたので、キーワードを変えてググってみると、色々追加されていることを知りました。(また、勉強の範囲が増える・・・)

    ヨチヨチですが、進めていますので、今後ともよろしくお願い致します。
    早く「意訳」できるようになりたい。

314×331 => 237×250
イメージ
1574729391.png
/9KB
違反を報告
[ 親 34393 / □ Tree ] 返信 削除キー/

▲[ 34396 ] / 返信無し
■34397 / 3階層)  Re[3]: こんな演算子初めて見ました。
□投稿者/ VBはじめました 一般人(24回)-(2019/11/26(Tue) 09:50:47)
  • アイコン解決済み
解決み!
違反を報告
[ 親 34393 / □ Tree ] 返信 削除キー/

▲[ 34396 ] / 返信無し
■34399 / 3階層)  Re[3]: こんな演算子初めて見ました。
□投稿者/ 魔界の仮面弁士 大御所(1264回)-(2019/11/26(Tue) 12:20:55)
  • アイコン# 解決済みマークはつけたままにしておきます。

    No34396に返信(VBはじめましたさんの記事)
    > LINQでGroup句を使用すると勝手に名前に[Key]って使われるので、また別の意味があるのかな?

    はい。その Key は Visual Basic の Key キーワードとは異なる意味を持ちます。


    クエリ構文の Group や、拡張メソッド構文の Enumerable.GroupBy メソッドでは
    列挙結果が IGrouping(Of TKey, TElement) 型の要素となるのですが、
    この型が持っている『Key プロパティ』を指していますね。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.igrouping-2.key?WT.mc_id=DT-MVP-8907&view=netframework-4.8


    > 「独習 VisualBasic2010」でも調べて、

    VB2010 当時の書籍をお使いのようですが、その後のバージョンでも
    細かい追加機能等が色々とありますので、幾つか紹介しておきます。
    (C# に比べれば、進化のスピードは緩めですが)

    http://bbs.wankuma.com/search.cgi?no=0&word=No87377&andor=and&logs=all&PAGE=20

    Dim a = 123 + 'VB2015 以降では、このコードで
     456 '変数 a に対して「579」が代入されるが
     'VB2013 以下ではエラーになる

    Dim b = 123 + _ 'VB2019 以降では、このコードで
     456 '変数 a に対して「579」が代入されるが
     'VB2015〜VB2017 ではエラーになる


    --- 以下抜粋 ---

    VB2012 (version 11.0) の新機能
    ・Iterator / Yield キーワードによる反復子の簡易実装をサポート(重要)
    ・Async / Await キーワードによる非同期処理実装をサポート(重要)
    ・メソッドの呼び出し元情報の自動埋め込み(Caller Information)
    https://www.atmarkit.co.jp/fdotnet/special/vs2012review/vs2012review_04.html

    VB2013 (version 12.0) の新機能
    ・Visual Studio の準備機能強化はあるが、言語機能の変更はなし。

    VB2015 (version 14.0) の新機能
    ・メソッド内での #Region〜#End Region の利用を許可(C# は以前からできていた)
    ・VB2005 で追加された IsNot 演算子を、TypeOf 演算子と共に使えるように
    ・NameOf 演算子の追加(リファクタリングや MVC に便利)
    ・文字列中での改行を許可("〜" 内で改行して良い)
    ・文字列補間(既に使用されていた $"〜" 構文)
    ・Null 条件演算子( Return foo?.Property とか Return foo?(idx) とか)
    ・日付型リテラルで #MM-dd-yyyy# 表記だけでなく #yyyy-MM-dd# も許可
    ・LINQ 式の途中などでのコメントをサポート
    https://qiita.com/tadnakam/items/9df14667db41cd81c193

    VB2017 (version 15.0) の新機能
    ・#Disable Warning と #Enable Warning による警告の部分的な抑制
    ・Partial Module および Partial Interface のサポート(VB2005 の Partial Class、VB2010 の Partial Private Sub の延長)
    ・タプル(ValueTuple 型)に対する言語サポート … Dim sample As (Url As String, Title As String)
    ・2 進数リテラルの追加 … Dim value As Byte = &B01101110
    ・数値リテラルの桁区切り記号 … Dim value As Integer = 123_456_789
    ・ByRef 戻り値のサポート … VB で宣言することはできないが、利用することはできる
    ・ReadOnly インターフェイスのプロパティ
    https://qiita.com/yaju/items/2b07b54444707ee9abae


    VB2017 2017年8月更新 (version 15.3) の新機能
    ・名前付きタプルの推論 … Dim sample = (Now, Err)

    VB2017 2017年12月更新 (version 15.5) の新機能
    ・「Private Protected」スコープの追加 … .NET Framework 1.0 当時からあったが、VB や C# ではサポートされていなかった
    ・非末尾名前付き引数のサポート … Array.Copy(sourceArray:=a, destinationArray:=b, 3)
    ・16 進数/2 進数/8 進数の先頭区切り記号 … Dim meat As Integer = &H_DEAD_BEEF

    VB2017 2018年8月更新 (version 15.8) の新機能
    ・浮動小数点数(Double, Single)を整数型に変換する際のパフォーマンスの大幅な向上

    VB2019 (version 16.0) の新機能
    ・明示的な行継続文字(空白+アンダーバー)の後でのコメントを許可
解決み!
違反を報告
[ 親 34393 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -