C#

2021年7月14日 (水)

[C#]逐語的文字列リテラルを使う

文字列リテラルの先頭に@を付けて表記する。以下、C#インタラクティブので実行例。

> Console.WriteLine("AB\\C");
AB\C
> Console.WriteLine("AB\C");
(1,22): error CS1009: 認識できないエスケープ シーケンスです
> Console.WriteLine(@"AB\C");
AB\C
> Console.WriteLine(@"AB\\C");
AB\\C
> Console.WriteLine(@"AB""C");
AB"C

2021年6月12日 (土)

[C#]C#のコードを対話的に入力・実行する(REPL)

C#インタラクティブ(Interactive)を使う。メニュー「表示」→「その他のウィンドウ」→「C#インタラクティブ」で、専用のウィンドウが開く。「>」がコマンドプロンプト。以下、操作例。



Microsoft (R) Visual C# インタラクティブ コンパイラ バージョン 3.9.0-6.21160.10 ()
'CSharpInteractive.rsp' からコンテキストを読み込んでいます。
詳細については、「#help」と入力します。
> s = "ABC";
(1,1): error CS0103: 現在のコンテキストに 's' という名前は存在しません
> string s;
> s = "ABC";
> Console.WriteLine(s);
ABC
> s = "AB\\C";
> Console.WriteLine(s);
AB\C
> s = @"AB\\C";
> Console.WriteLine(s);
AB\\C

2021年5月26日 (水)

[C#]コマンドプロンプトでコンパイルする(Visual Studio 2019 Professional)

Visual Studio 2019 Professionalを使ってコマンドプロンプトでコンパイルする場合、「スタートメニュー」→「Visual Studio 2019」→「Developer Command Prompt for VS 2019」で起動する専用のコマンドプロンプトを使うことが一般的だが、環境変数Pathに以下を追加するだけでも使えるようになる。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Roslyn

追加方法は以下のとおり。

エクスプローラー→「PC」のプロパティ→左側のメニュー「システムの詳細設定」→「システムのプロパティ」ダイアログが開いて「環境変数」ボタン→ユーザー環境変数でもシステム環境変数でもどちらでもかまわないが「Path」をクリック→「編集」ボタンを押す→「環境変数名の編集」ダイアログが開くが右側の「新規」ボタン→上記のディレクトリを追加→すべて「OK」ボタンを押して元に戻る

コンパイラーの実行ファイルはcsc.exe。

2020年1月 7日 (火)

[C#]文字列を数値に変換できるか否か確認する

TryParseメソッドを使用する。以下は、double(倍精度浮動小数点数)を使用した例。Double構造体はSystem名前空間に含まれていることから、using System;が事前に必要であることに注意。

TryParseメソッドは変換できるか否かを論理値(TrueかFalse)で返す。引数には、変換候補の文字列と、変換された場合の代入先の変数の2つを指定する必要がある。もし、変換できない場合は、後者の変数には0が代入される。下記の例では、事前にdouble d;としている。

Console.WriteLine(Double.TryParse("-123", out d));
Console.WriteLine(d);
Console.WriteLine(Double.TryParse("+1.23", out d));
Console.WriteLine(d);
Console.WriteLine(Double.TryParse(" 1.23 ", out d));
Console.WriteLine(d);
Console.WriteLine(Double.TryParse("+1.2.3", out d));
Console.WriteLine(d);
Console.WriteLine(Double.TryParse("1.2a", out d));
Console.WriteLine(d);

出力

True
-123
True
1.23
True
1.23
False
0
False
0

正負の記号は識別する。文字列の前後に空白があっても変換される。小数点が2つあったり英字が含まれる場合は変換されない。

2020年1月 5日 (日)

[C#]文字列の長さをバイト単位で得る

EncodingクラスのGetByteCountクラスを使う。

System.Text.Encoding sjis =
System.Text.Encoding.GetEncoding("shift_jis");
Console.WriteLine("ABC".Length);
Console.WriteLine("あい".Length);
Console.WriteLine("ABあいう".Length);
Console.WriteLine(sjis.GetByteCount("ABC"));
Console.WriteLine(sjis.GetByteCount("あい"));
Console.WriteLine(sjis.GetByteCount("ABあいう"));

出力結果

3
2
5
3
4
8

C#は文字列の文字コードに、すべての文字を2バイトで表現するUnicodeを使っている。一方でMS-DOS時代は、いわゆる半角文字(上記の例では「A」や「B」)は1バイトで、全角文字(上記の例では「あ」や「い」)は2バイトで文字を表現していた。そのため、文字列の文字コードにシフトJIS(shift_jis)を指定して、何バイトか調べれば、文字列の長さをバイト単位で得ることができる。

2019年12月20日 (金)

[C#]コマンドラインにおけるコンパイラーのオプション

C#のコンパイラー(csc.exe)のコンパイルオプションは、-optionもしくは/option という 2 つの形で指定することができる。

>csc.exe /debug Plateau.cs
>csc.exe -debug Plateau.cs

どちらを使用しても変わらない。
Windowsのコマンドプロンプトにおけるコンパイラ等のオプションは、慣例的に/(スラッシュ)が使われることが多いが、C#のコンパイラーでは-(ハイフン)も問題なく使用できる。これは、公式ページにも書かれている。

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/

2019年12月18日 (水)

[C#]キャッチした例外の発生場所(ソースコードの行番号)を出力する

try-catch命令で例外をキャッチし、tryブロックで強制的に例外を発生させてみる(以下の例では、配列のインデックスに0を指定)。

} catch (Exception ex) {
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}

以下のような出力があるはず。

インデックスが配列の境界外です。
場所 ○○.Main(String[] args)

これでは例外が発生した場所がわからないため不便。コマンドラインでコンパイルをする際に-debugオプションを指定すると、例外が発生したときに発生場所(ソースコードの行番号)が出力されるようになる。

>csc.exe -debug ○○.cs

出力は以下のようになるはず。

インデックスが配列の境界外です。
場所 ○○.Main(String[] args) 場所 ○○.cs:行 ××

2019年12月16日 (月)

[C#]文字列の一部の文字をバイト単位で抜き出す

C#は文字列の文字コードはUnicodeのため、例えばSubstringメソッドで文字列の一部を抜き出す場合は、文字単位でしか指定することができない。これをバイト単位で抜き出すには、以下のように文字コードにシフトJISを指定して、EncodingクラスのGetBytesメソッドとGetStringメソッドを利用する。

static string SubstringByte(string s, int i, int n) {
System.Text.Encoding sjis =
System.Text.Encoding.GetEncoding("shift_jis");
byte[] b = sjis.GetBytes(s);
return sjis.GetString(b, i, n);
}

第2引数にはSubstringメソッドと同様に、開始のインデックス(1文字目が0)を指定する。第3引数には抜き出すバイト数を指定する。

Console.WriteLine(SubstringByte("ABCDE", 0, 2));
Console.WriteLine(SubstringByte("ABCDE", 1, 3));
Console.WriteLine(SubstringByte("あいうえ", 0, 4));
Console.WriteLine(SubstringByte("あいうえ", 2, 2));
Console.WriteLine(SubstringByte("あいABC", 0, 5));
Console.WriteLine(SubstringByte("あいABC", 2, 4));
Console.WriteLine(SubstringByte("あいABC", 1, 4));

出力結果

AB
BCD
あい

あいA
いAB
(0xA0)いA ※先頭文字は画面表示不可の0xA0が表示

上記の自作メソッドは、マルチバイトの文字の処理は行っていない。そのため、最後の例のようにマルチバイトの文字列を分断するような指定をした場合は、バイト単位でそのとおりに処理されるので当然出力は乱れるので注意。

2019年6月22日 (土)

[C#]エラーメッセージ:ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

コンパイルした実行ファイル(*.exe)を実行したときにこのエラーメッセージが表示されたら、配列で宣言したクラスを使用する前に初期化をしているか確認する。

例えば以下のような使い方をすると、このエラーメッセージが表示される。Carは自作クラス。

Car[] kokusan = new Car[10];
kokusan[0].kakaku = 0;

配列として宣言しただけでは使うことはできず、各要素を使用する前に要素ごとに初期化をしなければならない。

Car[] kokusan = new Car[10];
kokusan[0] = new Car();
kokusan[0].kakaku = 0;

2019年6月15日 (土)

[C#]小数を任意の桁数表示の文字列に変換する

WriteLineメソッド等で書式を指定する。書式の指定に f を使う。

> Console.WriteLine("{0:F4} {1:F4}", 12.34, 5.678)
12.3400 5.6780
> Console.WriteLine("{0,9:F3} {1,9:F5}", 12.34, 5.678)
12.340 5.67800

最初の例では、コロン(:)の左側の数字は、書式以降に指定した何番目の引数かということ。0から始まることに注意。

2番目の例では、コンマ(,)の左側の数字は、書式以降に指定した何番目の引数かということであり、コンマ(,)とコロン(:)に挟まれた数値は文字列の文字幅を示す。

 

無料ブログはココログ