トップ回答者
VB.NETにおけるコード内の改行の取扱について

質問
-
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で許可されるコーディング方法で作成したモジュールは環境依存しないでしょうか?
以上、よろしくお願いします。
回答
-
プロジェクトファイル(*.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!)
-
> 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
-
> 一旦は、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
すべての返信
-
以下の話はご存知でしょうか?
VB 10 でアンダースコアが不要に
https://www.infoq.com/jp/news/2009/04/vb_underscores -
マルチポストのようですので、そこへのリンクを張っておきます
https://teratail.com/questions/55500
質問者さんへ>マルチポストは歓迎されません。理由が分からなければ「マルチポスト」でググってみてください。このフォーラムでは遠慮してくださいとの案内が出ています。
https://social.msdn.microsoft.com/Forums/ja-JP/93915a1e-22bc-4a23-83b1-f1ff47dccc82?forum=suggestja
-
> 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
-
>SurferOnWww さん
まずは、マルチポストとしてしまった事、申し訳ありません。
リンク先はクローズしておきました。
ルール違反、申し訳ありませんでした。
「VB 10 でアンダースコアが不要に」のリンク、ありがとうございます。
なるほど、VB10からこのような仕様になっていたのですね。
その後少し調べましたら、VB10(Visual Basic 2010)からということですね。
そうなると謎なのが、Visual Studio 2013の環境には.NET Framework 4.6.1 を導入した状態です。
上記が正しいなら、Visual Studio 2013の環境でエラーが出ていた説明が付かないのでは無いでしょうか?
>ひらぽん さん
VB10というよりは、VB15の仕様で対応されたということですね。
昔にコーティングしていた際は"_"が必要だったのですが、今は不要。
確かに統一感が出て嬉しい事なのですが、実際の現場ではどうなのかというイメージを持っています。
昔から触った事があるメンバーと新たに触るメンバーで実装方法に差が出てくるような気が。
コーティングルールを固めたり、レビューで検知すれば良いとは思いますが、全てを賄えないと思うので
プロジェクト内でバラバラになりそうな予感が勝っています。
また、メンバーによっては今回のようにバージョンが異なる場合も考えられるため、保守を考えるとこの技術対応を飲み込むのに躊躇している状態です。 -
Visual Basic 2010(VB 10)の新機能には暗黙の行連結機能があります。SurferOnWwwさんの回答はこちらです。
それとは別にVisual Basic 2015(VB14)の新機能には複数行の文字列リテラルがあります。質問の内容はこちらです。
-
>ひらぽん さん
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?
- 編集済み ひらぽんModerator 2016年11月17日 8:12
-
ひらぽんさんの意見を否定するわけではありません。
現実問題として、
- Visual Studioは2010以降はプロジェクトファイルのアップグレードが不要になっています。
- 結果、質問者さんのように開発者ごとにVisual Studioのバージョンが混在可能になっています。
- それとは別にVBには代々オートコレクトがあり、強制的に修正されることがあります。
これらが組み合わされると、VB 2015でコードを編集して保存した瞬間に、VB 2013では無効な構文に書き換えられることがある、という状況に陥るわけで。
開発環境を統一する必要がある…ぐらいでしょうかね。
- 回答の候補に設定 星 睦美 2016年11月22日 4:45
-
あ、そうか、2013 と 2015 の混在環境でしたね。失礼しました(^^;
もっとも中小規模の企業や個人開発者なら、Professional 同等の無償版 Visual Studio Community を利用できますし、以前に比べ開発環境を揃えるのが容易になった感があります。これを機に 2015 に統一するというのもありだと思います。
本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?
- 編集済み ひらぽんModerator 2016年11月18日 1:18
-
> 一旦は、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
-
プロジェクトファイル(*.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!)