5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VB.Net から移行した人のための C# Tips

Last updated at Posted at 2021-10-04

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 )

回避するには、次ぐらいでしょうか。

  1. 代入構文での記述をあきらめて、SetHoge というような関数を作る。
  2. 配列や、Dictionary オブジェクトを返すようにする。
  3. 専用のクラスを作る。

これだけでも、それぞれをまじめに書くとけっこうな量になるのでとりあえずこれぐらいで。

#==演算子のoverload はやめておいた方がいい。
あんまり使ってる人もいない気がしますが、まれに==演算子を overload することがあるかと思います。
VB.Net では Nothing との比較に Is や IsNot を使う事が多いので Nothing との比較に ==演算子を使う事はあまりないかと思いますが、C# では isnot 比較演算子がないことから null との比較を == や != でやることが多いです。
その際に、== 演算子を overload していると想定外の動作をすることがあります。詳しくは、こちら

#イベントを一覧から追加したい。
VB.Net だと、ソースエディタの上の方でイベントを追加できましたが、C# では(たぶん)できません。
プロパティウィンドウの中に「雷」アイコンがあるのでそこから追加しましょう。
vb.png

#ByRef 相当の構文は二つある。
VB.Net は値の参照渡しで、ByRef という構文要素がありました。
これは C# では outref と二つに分かれます。使い分けは、こんな感じ。

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# にしてよかったなぁと思っちゃいます。

5
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?