C#」カテゴリーアーカイブ

プログラミング言語「C#」に関するカテゴリーです。

C#でソースコードの行番号やファイル名を取得する方法

C++言語では__LINE____FILE__のマクロでソースコードの行番号やファイル名を取得することができます。C#でもこれと同じようなことをしたいと思って方法を調べてみました。

StackFrameを使う方法

using System;
using System.Diagnostics;

public class Example1
{
  public static void Main()
  {
    StackFrame stackFrame = new StackFrame(true);

    int fileLineNumber = stackFrame.GetFileLineNumber();
    string fileName = stackFrame.GetFileName();

    Console.WriteLine($"FileLineNumber: {fileLineNumber}");
    Console.WriteLine($"FileName: {fileName}");
  }
}

実行結果

FileLineNumber: 8
FileName: C:\work\example1.cs

CallerLineNumber/CallerFilePathを使う方法

using System;
using System.Runtime.CompilerServices;

public class Example2
{
  public static void Main()
  {
    test();
  }

  static void test([CallerLineNumber] int lineNumber = 0, [CallerFilePath] string filePath = null)
  {
    Console.WriteLine($"LineNumber: {lineNumber}");
    Console.WriteLine($"FilePath: {filePath}");
  }
}

実行結果

LineNumber: 8
FilePath: C:\work\example2.cs

ファイル名のみを取得したい場合

どちらの方法を使っても取得できるのはファイル名ではなく、ファイルパスになっています。ファイル名のみを取得したい場合はGetFileNameを使うと便利です。

string fileName = System.IO.Path.GetFileName(filePath);

リンク

StackFrame Class (System.Diagnostics) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stackframe?view=net-6.0

System.Runtime.CompilerServices Namespace | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices?view=net-6.0

C#で数値を文字列に変換したり文字列を数値に変換したりする方法

C#で数値を文字列に変換したり文字列を数値に変換したりする方法のまとめ。

数値 ⇒ 文字列の変換

数値から文字列への変換にはToString()が使えます。

サンプルコード

using System;

public class Example1
{
  public static void Main()
  {
    int value1 = 123;
    float value2 = 456.78f;

    Console.WriteLine("value1 = " + value1.ToString());
    Console.WriteLine("value2 = " + value2.ToString());
  }
}

実行結果

value1 = 123
value2 = 456.78

文字列 ⇒ 数値の変換

文字列から数値への変換はParse()が使えます。
例外を発生させたくない場合はTryParse()も使えます。

サンプルコード

using System;

public class Example2
{
  public static void Main()
  {
    try
    {
      int value1 = int.Parse("123");
      float value2 = float.Parse("456.78");

      Console.WriteLine("value1 = " + value1);
      Console.WriteLine("value2 = " + value2);
    }
    catch (FormatException)
    {
    }
  }
}

実行結果

value1 = 123
value2 = 456.78

文字列 ⇒ 数値の変換(TryParse編)

サンプルコード

using System;

public class Example3
{
  public static void Main()
  {
    if (int.TryParse("123", out int value1))
    {
      Console.WriteLine("value1 = " + value1);
    }
    if (float.TryParse("456.78", out float value2))
    {
      Console.WriteLine("value2 = " + value2);
    }
  }
}

実行結果

value1 = 123
value2 = 456.78

リンク

How to convert a string to a number – C# Programming Guide | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-a-string-to-a-number

C#のtuple型

C#でもPythonなどと同じようにtuple型が使えます。

tuple型の使い方

( ),を使って(1, 2, "abc")のような感じで書くとtuple型になります。
各要素の参照はItem1Item2Item3になります。

サンプル

using System;

public class Example1
{
  static public void Main ()
  {
    var tuple = (1, 2, "abc");
    Console.WriteLine($"{tuple.Item1} {tuple.Item2} {tuple.Item3}");
  }
}

実行結果

1 2 abc

varの部分はValueTuple<int, int, string>と書くこともできます。

Listでtuple型を使いたい場合

Listと組み合わせて使いたい場合は

List<ValueTuple<int, int, string>>

もしくは

List<(int, int, string)>

のようにして使い▽ます。

サンプル

using System;
using System.Collections.Generic;

public class Example2
{
  static public void Main ()
  {
    var list = new List<(int, int, string)>();
    list.Add((1, 2, "abc"));
    list.Add((3, 4, "def"));

    foreach(var tuple in list)
    {
      Console.WriteLine($"{tuple.Item1} {tuple.Item2} {tuple.Item3}");
    }
  }
}

実行結果

1 2 abc
3 4 def

Tuple Class

ValueTupleの方が使い易いと思いますが、これとは別にTuple Classというものもあります。

使い方は次のような感じです。

サンプル

using System;

public class Example3
{
  static public void Main ()
  {
    var tuple = Tuple.Create(1, 2, "abc");
    Console.WriteLine($"{tuple.Item1} {tuple.Item2} {tuple.Item3}");
  }
}

実行結果

1 2 abc

ValueTupleとTuple Classの変換

ValueTupleをTuple Classに変換したい場合は.ToTuple()、Tuple ClassをValue Tupleに変換したい場合は.ToValueTuple()を使って相互に変換できます。

サンプル

using System;

public class Example4
{
  static public void Main ()
  {
    Tuple<int, int, string> tuple1 = (1, 2, "abc").ToTuple();
    ValueTuple<int, int, string> tuple2 = Tuple.Create(3, 4, "def").ToValueTuple();
    
    Console.WriteLine($"{tuple1.Item1} {tuple1.Item2} {tuple1.Item3}");
    Console.WriteLine($"{tuple2.Item1} {tuple2.Item2} {tuple2.Item3}");
  }
}

実行結果

1 2 abc
3 4 def

リンク

Tuple types – C# Guide | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/tuples

Tuple Class (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.tuple