VB.Net が、言語的な発展をしないということなどから、VB.Net を C# に移行しました。
その際に、もうちょっと早くに知っていればよかった、、、という C# 経験者には不要ですが、VB.Net から移行した人向けの Tips で検索にひっかかりにくいものをまとめてみました。
間違いがあったらすいません💦
#特定のModuleの関数をグローバル関数にしたい。
C# でグローバル関数を使う事の是非はあるかと思いますが、そんな時はソースの最初にこんなのを書きましょう。
using static Project.Module1;
これで、Module1 に書いた static な関数がグローバルに(クラス名を記載せずに)呼び出せるようになります。
#複数のファイルに共通した using を定義したい。
上のようなことをやろうとすると、すべてのファイルに using
を書かないといけないので面倒ですよね。
VB.Net では、それをプロジェクトの定義でできたのですが、(たぶん)C#ではできません。
ソースコードを、他のプロジェクト等に移行しやすいように、プログラムはソースコードで完結すべきというのが理由のようです。
残念ですが、あきらめましょう。
コメントで@karakunさんから教えていただきましたが、.NET 6 が使えるようになる C# 10.0 から global using
で宣言できるようです。
詳細はこちら。
#System.IO.File を IO.File で記述したい。
C# では残念なことに、using System;
と書いても、その namespace 内のクラスが直接書けるようになるだけです。
そのため VB.Net では Imports System
と記述すると System.IO.File
内のクラスを書きたいときには、IO.File
と書いて参照できましたが C# では参照してくません。
こんな時は、下記のように書きましょう。
using IO = System.IO;
参照先ひとつづつ書くのは面倒ですが、がんばりましょう。
#インデックスプロパティを使いたい。
VB.Net ではプロパティに引数をつけれるインデックスプロパティというのがあります。
残念ながら、C# にはありません。
Dictionary の Item のように、C# にもあるじゃないかと思うこともありますが、これは各クラスに一つだけインデクサとして作成することができます。
VB.Net では次のように、Default をつけたプロパティが、C# でいうインデクサに相当します。そのため一つしか作成できません。
Public Default Property Hoge( key As String )
回避するには、次ぐらいでしょうか。
- 代入構文での記述をあきらめて、SetHoge というような関数を作る。
- 配列や、Dictionary オブジェクトを返すようにする。
- 専用のクラスを作る。
これだけでも、それぞれをまじめに書くとけっこうな量になるのでとりあえずこれぐらいで。
#==演算子のoverload はやめておいた方がいい。
あんまり使ってる人もいない気がしますが、まれに==演算子を overload することがあるかと思います。
VB.Net では Nothing との比較に Is や IsNot を使う事が多いので Nothing との比較に ==演算子を使う事はあまりないかと思いますが、C# では isnot 比較演算子がないことから null との比較を == や != でやることが多いです。
その際に、== 演算子を overload していると想定外の動作をすることがあります。詳しくは、こちら
#イベントを一覧から追加したい。
VB.Net だと、ソースエディタの上の方でイベントを追加できましたが、C# では(たぶん)できません。
プロパティウィンドウの中に「雷」アイコンがあるのでそこから追加しましょう。
#ByRef 相当の構文は二つある。
VB.Net は値の参照渡しで、ByRef という構文要素がありました。
これは C# では out
と ref
と二つに分かれます。使い分けは、こんな感じ。
void Hoge( out int value ) {
value = 0;
}
void Fuga( ref int value ) {
value = ( value == 0 ? value : value + 1 );
}
つまり out
は中身を参照しない値、ref
は値を参照したうえで結果も渡す場合。
ぶっちゃけ、ref
だけでもそんなに問題ない気もしますが、ちゃんとしておくと変数の初期化の警告で丁寧に教えてくれるので幸せになれます。
#カッコとかのコーディング規則は、後から決めてもいい。
VB.Net だとほとんど強制されるので気にしなくてよかったですが、C# では、{
の位置とか、いろいろ決めたくなります。
これは、後から Visual Studio のツールで一括変換できるので後から考えても大丈夫。
VB.Net だと、Me
をつけるかどうか統一されてなかったりしますが、C# はこういうのもツールで一括変換できるのでこういうところでも C# にしてよかったなぁと思っちゃいます。