none
VB.NETにおけるコード内の改行の取扱について RRS feed

  • 質問

  • Visual Basicでの開発時におけるコード内改行についてご質問します。
    開発環境としては
     ・Visual Studio 2013
     ・Visual Studio 2015

    の2種類の環境があります。

    2015の開発環境で以下のようなコードを記載すると問題ありません。
    ---------------------------------------------------------------------------------------------
    MsgBox("テスト画面
    "改行の確認テストです。")
    ---------------------------------------------------------------------------------------------


    これを2013ではエラーが出て、以下のように記載する必要があります。
    ---------------------------------------------------------------------------------------------
    MsgBox("テスト画面" & _
    "改行の確認テストです。")
    ---------------------------------------------------------------------------------------------


    また、2015で以下のようなコードを記載すると、
    ---------------------------------------------------------------------------------------------
    MsgBox("テスト画面" & _
    "改行の確認テストです。")
    ---------------------------------------------------------------------------------------------


    コンパイル時には"&(アンパサンド)"が消えるという事象も出ています。
    以下のコーディングにすると、2015でも2013でもコンパイルが通る状態です。
    ---------------------------------------------------------------------------------------------
    MsgBox("テスト画面" _
    & "改行の確認テストです。")
    ---------------------------------------------------------------------------------------------


    今までのVBのコーティングとしては、改行を行う場合は"_(アンダーバー)"が必要だったと記憶しています。
    それが2015では無くてもコーティング出来ることに違和感を感じます。

    確認したいことは以下の内容です。
    ①Visual Studio 2015ではコンパイルが通るということは、コーディングルールに変更が出たということでしょうか?
    ②VBから見た場合、""で囲まれたコードだと途中に改行コードやスペース等が含まれた状態になるかと思います。
     (例)
      sql = " SELECT *
                FROM TEST "
     改行コードやスペースが含まれることによる弊害は出ないのでしょうか?
    ③2015で許可されるコーディング方法で作成したモジュールは環境依存しないでしょうか?


    以上、よろしくお願いします。

    2016年11月17日 2:51

回答

  • プロジェクトファイル(*.vbproj)に言語機能のバージョンを指定しておくと、VS2015で新しい機能を使用するとエラーにしてくれます。
    VS2013に合わせるならバージョン11を指定します。
    Conditionを使って切り替えるといったことも可能です。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
        <!-- 省略-->  
    
        <PropertyGroup>
            <!-- VS2008 -->
            <!-- <LangVersion>9.0</LangVersion> -->
            <!-- VS2010?-->
            <!-- <LangVersion>10.0</LangVersion> -->
    
            <!-- VS2012,VS2013 -->
            <LangVersion>11.0</LangVersion>
    
            <!-- VS2015 -->
            <!-- <LangVersion>14.0</LangVersion> -->
      </PropertyGroup>
     
    </Project>
    #結論出ているようなので今更かもしれませんが

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2016年11月22日 4:44
    • 回答としてマーク int-tai 2016年11月24日 0:47
    2016年11月21日 3:46
  • > Visual Studio 2015ではコンパイルが通るということは、コーディングルールに変更が出たということでしょうか?

    はい。Visual Basic 2015 では「複数行の文字列リテラル」が追加されました。よって

    Dim str = "VB2015では
    複数行の文字列リテラルが追加されました。”


    という文もコンパイル可能になってます。これはC#の「逐語的文字列リテラル」に対応するものです。

    var str = @"C#では、もともと言語仕様に
    「逐語的文字列」リテラルが存在する。
    先頭に@を加えると文字列リテラルが有効になる"

    ちなみに私は C# と VB を併用してるため、特に違和感は感じてません。むしろC#にあって VB に存在しなかった構文機能が追加されたため、.NET 関連言語の仕様が統一する方に向かうのは喜ばしいことだと思っています。

    Visual Basic 14 における強化点トップ 14



    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    • 編集済み ひらぽんModerator 2016年11月17日 4:04 リンクの追加と誤字の訂正
    • 回答としてマーク int-tai 2016年11月24日 0:46
    2016年11月17日 3:58
    モデレータ
  • > 一旦は、2015の開発環境で統一する方針で行く事に決まりました。

    それはよかったです。^^

    ちなみに VS2013 と 2015 では、単に言語仕様の変更だけでなく、コンパイラそのものの変更という大きな仕様変更が発生しました。それが、オープンソースの.NET コンパイラプラットフォーム「Roslyn」 です。VB2015 における言語仕様変更は、Roslyn の採用によるところが大きいです。

    .NETコンパイラープラットフォーム:Roslyn

    Roslyn の搭載により、従来 C# にあって VB になかったリファクタリング機能が加わり、VB のコードの品質向上が大いに期待できるようになっています。詳しくは以下をご覧ください。

    Visual Studio 2015の新機能“Roslyn”とは


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?

    • 回答としてマーク int-tai 2016年11月24日 0:47
    2016年11月21日 2:10
    モデレータ

すべての返信

  • 以下の話はご存知でしょうか?

    VB 10 でアンダースコアが不要に
    https://www.infoq.com/jp/news/2009/04/vb_underscores

    2016年11月17日 3:05
  • マルチポストのようですので、そこへのリンクを張っておきます
    https://teratail.com/questions/55500


    質問者さんへ>

    マルチポストは歓迎されません。理由が分からなければ「マルチポスト」でググってみてください。このフォーラムでは遠慮してくださいとの案内が出ています。

    https://social.msdn.microsoft.com/Forums/ja-JP/93915a1e-22bc-4a23-83b1-f1ff47dccc82?forum=suggestja

    2016年11月17日 3:26
  • > Visual Studio 2015ではコンパイルが通るということは、コーディングルールに変更が出たということでしょうか?

    はい。Visual Basic 2015 では「複数行の文字列リテラル」が追加されました。よって

    Dim str = "VB2015では
    複数行の文字列リテラルが追加されました。”


    という文もコンパイル可能になってます。これはC#の「逐語的文字列リテラル」に対応するものです。

    var str = @"C#では、もともと言語仕様に
    「逐語的文字列」リテラルが存在する。
    先頭に@を加えると文字列リテラルが有効になる"

    ちなみに私は C# と VB を併用してるため、特に違和感は感じてません。むしろC#にあって VB に存在しなかった構文機能が追加されたため、.NET 関連言語の仕様が統一する方に向かうのは喜ばしいことだと思っています。

    Visual Basic 14 における強化点トップ 14



    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    • 編集済み ひらぽんModerator 2016年11月17日 4:04 リンクの追加と誤字の訂正
    • 回答としてマーク int-tai 2016年11月24日 0:46
    2016年11月17日 3:58
    モデレータ
  • >SurferOnWww さん
    まずは、マルチポストとしてしまった事、申し訳ありません。
    リンク先はクローズしておきました。
    ルール違反、申し訳ありませんでした。

    「VB 10 でアンダースコアが不要に」のリンク、ありがとうございます。
    なるほど、VB10からこのような仕様になっていたのですね。
    その後少し調べましたら、VB10(Visual Basic 2010)からということですね。
    そうなると謎なのが、Visual Studio 2013の環境には.NET Framework 4.6.1 を導入した状態です。
    上記が正しいなら、Visual Studio 2013の環境でエラーが出ていた説明が付かないのでは無いでしょうか?

    >ひらぽん さん
    VB10というよりは、VB15の仕様で対応されたということですね。
    昔にコーティングしていた際は"_"が必要だったのですが、今は不要。
    確かに統一感が出て嬉しい事なのですが、実際の現場ではどうなのかというイメージを持っています。
    昔から触った事があるメンバーと新たに触るメンバーで実装方法に差が出てくるような気が。
    コーティングルールを固めたり、レビューで検知すれば良いとは思いますが、全てを賄えないと思うので
    プロジェクト内でバラバラになりそうな予感が勝っています。

    また、メンバーによっては今回のようにバージョンが異なる場合も考えられるため、保守を考えるとこの技術対応を飲み込むのに躊躇している状態です。
    2016年11月17日 6:00
  • Visual Basic 2010(VB 10)の新機能には暗黙の行連結機能があります。SurferOnWwwさんの回答はこちらです。

    それとは別にVisual Basic 2015(VB14)の新機能には複数行の文字列リテラルがあります。質問の内容はこちらです。

    2016年11月17日 6:21
  • > その後少し調べましたら、VB10(Visual Basic 2010)からということですね。

    そうですね。思い違いしていました、すみません。

    ひらぽんさんと佐祐理さんのレスが質問者さんの質問に対する正しい回答だと思います。

    2016年11月17日 7:00
  • >ひらぽん さん
    VB10というよりは、VB15の仕様で対応されたということですね。
    昔にコーティングしていた際は"_"が必要だったのですが、今は不要。
    確かに統一感が出て嬉しい事なのですが、実際の現場ではどうなのかというイメージを持っています。
    昔から触った事があるメンバーと新たに触るメンバーで実装方法に差が出てくるような気が。
    コーティングルールを固めたり、レビューで検知すれば良いとは思いますが、全てを賄えないと思うので
    プロジェクト内でバラバラになりそうな予感が勝っています。

    また、メンバーによっては今回のようにバージョンが異なる場合も考えられるため、保守を考えるとこの技術対応を飲み込むのに躊躇している状態です。

    それ言い出したらキリがないというのが正直な感想ですね。

    コーディングを旧い技術者に合わせねばならないのなら・・・もしPGが VB6 のコーディングしか知らなかったら .NET で開発する利点なくなりますし、事前バインディングによるコーディング経験がなかったらパフォーマンスが犠牲になります。

    また「LINQ を使うな」という現場もあるようですが、個人的には馬鹿馬鹿しいの最たるものですし、そういう現場にはいくら金積まれても行きたいと思わない。まず優秀な .NET エンジニアは集まらないでしょうね。

    C#の達人・岩永さんが、以下の記事で「社内標準みたいなの決めて統制かける意味あるのかなぁ」と言われてますが全く同感。プロジェクトで統一すべきは「クラスライブラリの仕様」であって、コーディングルールじゃない筈です。また.NET の場合、クラスライブラリの仕様で標準化すべき明確なルールが存在します。

    https://ufcpp.wordpress.com/2013/01/29/keep-yourself-up-to-date/

    というわけで、コーディングルール決めるより、むしろ「クラスライブラリの標準化」を強くお勧めします。

    Framework デザイン ガイドライン


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    2016年11月17日 8:07
    モデレータ
  • ひらぽんさんの意見を否定するわけではありません。

    現実問題として、

    • Visual Studioは2010以降はプロジェクトファイルのアップグレードが不要になっています。
    • 結果、質問者さんのように開発者ごとにVisual Studioのバージョンが混在可能になっています。
    • それとは別にVBには代々オートコレクトがあり、強制的に修正されることがあります。

    これらが組み合わされると、VB 2015でコードを編集して保存した瞬間に、VB 2013では無効な構文に書き換えられることがある、という状況に陥るわけで。

    開発環境を統一する必要がある…ぐらいでしょうかね。

    • 回答の候補に設定 星 睦美 2016年11月22日 4:45
    2016年11月18日 0:57
  • あ、そうか、2013 と 2015 の混在環境でしたね。失礼しました(^^;

    もっとも中小規模の企業や個人開発者なら、Professional 同等の無償版 Visual Studio Community を利用できますし、以前に比べ開発環境を揃えるのが容易になった感があります。これを機に 2015 に統一するというのもありだと思います。


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    2016年11月18日 1:17
    モデレータ
  • ご連絡が遅くなり申し訳ありません。

    >佐祐理

    >ひらぽん

    まさにその通りです。

    混在している環境だったために、どうするかが課題として上がりました。

    一旦は、2015の開発環境で統一する方針で行く事に決まりました。

    なのでメンバーによっては、2013ならびに2015をインストールした状態となります。

    最近のPCは性能は悪くないため大丈夫かと思いますが、スペックはある程度要求されそうです。。


    2016年11月21日 0:19
  • > 一旦は、2015の開発環境で統一する方針で行く事に決まりました。

    それはよかったです。^^

    ちなみに VS2013 と 2015 では、単に言語仕様の変更だけでなく、コンパイラそのものの変更という大きな仕様変更が発生しました。それが、オープンソースの.NET コンパイラプラットフォーム「Roslyn」 です。VB2015 における言語仕様変更は、Roslyn の採用によるところが大きいです。

    .NETコンパイラープラットフォーム:Roslyn

    Roslyn の搭載により、従来 C# にあって VB になかったリファクタリング機能が加わり、VB のコードの品質向上が大いに期待できるようになっています。詳しくは以下をご覧ください。

    Visual Studio 2015の新機能“Roslyn”とは


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?

    • 回答としてマーク int-tai 2016年11月24日 0:47
    2016年11月21日 2:10
    モデレータ
  • プロジェクトファイル(*.vbproj)に言語機能のバージョンを指定しておくと、VS2015で新しい機能を使用するとエラーにしてくれます。
    VS2013に合わせるならバージョン11を指定します。
    Conditionを使って切り替えるといったことも可能です。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
        <!-- 省略-->  
    
        <PropertyGroup>
            <!-- VS2008 -->
            <!-- <LangVersion>9.0</LangVersion> -->
            <!-- VS2010?-->
            <!-- <LangVersion>10.0</LangVersion> -->
    
            <!-- VS2012,VS2013 -->
            <LangVersion>11.0</LangVersion>
    
            <!-- VS2015 -->
            <!-- <LangVersion>14.0</LangVersion> -->
      </PropertyGroup>
     
    </Project>
    #結論出ているようなので今更かもしれませんが

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2016年11月22日 4:44
    • 回答としてマーク int-tai 2016年11月24日 0:47
    2016年11月21日 3:46