ソースレベルの情報(Caller属性)
CallerMemberName、CallerFilePath、CallerLineNumberを使い、ログ、ガード、プロパティ通知のために呼び出し元の情報を取得します。
「ソースレベルの情報(Caller属性)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
呼び出し元情報について
目的: 呼び出し箇所の情報を自動的に取得します。
- CallerMemberName — 呼び出し元のメンバー
- CallerFilePath — 呼び出し元のファイル
- CallerLineNumber — 呼び出し元の行
- ログ、ガード、通知に適しています
ログ用のメンバー名
CallerMemberName は、引数を省略すると呼び出し元のメソッド名またはプロパティ名を自動的に設定します。
using System;
using System.Runtime.CompilerServices;
public static class Log
{
// Caller fills "member" automatically if not provided
public static void Info(string msg, [CallerMemberName] string member = null)
{
Console.WriteLine("[" + (member ?? "?") + "] " + msg);
}
}
public class Program
{
static void DoWork() { Log.Info("started"); }
public static void Main(string[] args)
{
Log.Info("app boot");
DoWork(); // prints caller method name
}
}
ファイルと行の情報
詳細な診断情報を得るには、CallerFilePath と CallerLineNumber を追加します。
using System;
using System.Runtime.CompilerServices;
public static class Diag
{
public static void Trace(string msg,
[CallerFilePath] string file = null,
[CallerLineNumber] int line = 0,
[CallerMemberName] string member = null)
{
Console.WriteLine(file + ":" + line + " in " + member + " -> " + msg);
}
}
public class Program
{
static void Step() { Diag.Trace("stepping"); }
public static void Main(string[] args)
{
Diag.Trace("start");
Step();
}
}
プロパティ変更通知
セッターやイベントヘルパーで CallerMemberName を使用すると、ハードコードされた文字列を避けられます。
using System;
using System.Runtime.CompilerServices;
public class Person
{
private string _name;
// Notify helper uses CallerMemberName so callers need not pass the property name
void Notify([CallerMemberName] string property = null)
{
Console.WriteLine("Changed: " + property);
}
public string Name
{
get { return _name; }
set { _name = value; Notify(); } // property name auto-filled
}
}
public class Program
{
public static void Main(string[] args)
{
Person p = new Person();
p.Name = "Ada"; // prints "Changed: Name"
}
}
呼び出し元名を使ったガード
呼び出し元情報を使うと、手動で文字列を指定しなくてもガードメッセージをわかりやすくできます。
using System;
using System.Runtime.CompilerServices;
public static class Guard
{
public static void NotNull(object x, [CallerMemberName] string caller = null)
{
if (x == null) throw new ArgumentNullException("value", "Null passed by " + (caller ?? "?"));
}
}
public class Program
{
static void Save(string path)
{
Guard.NotNull(path); // if null, message includes "Save"
Console.WriteLine("Saving to " + path);
}
public static void Main(string[] args)
{
try
{
Save(null);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
ヒントと注意事項
注意:
- 呼び出し元属性は、既定値を持つオプションパラメーターで機能します。
- 秘密情報について、正確なファイルパスに依存しないでください。パスからフォルダー構成が明らかになる可能性があります。
- ロギング、診断、プロパティ変更イベントに適しています。
呼び出し元名属性
まとめ
まとめ: オプションパラメーターに CallerMemberName、CallerFilePath、CallerLineNumber を追加すると、追加コストなしで呼び出し元のコンテキストを取得できます。
よくある質問
「ソースレベルの情報(Caller属性)」レッスンは無料ですか?
はい。「ソースレベルの情報(Caller属性)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「ソースレベルの情報(Caller属性)」で何を学びますか?
CallerMemberName、CallerFilePath、CallerLineNumberを使い、ログ、ガード、プロパティ通知のために呼び出し元の情報を取得します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「ソースレベルの情報(Caller属性)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Type、MethodInfo、アクティベーション、カスタム属性
- ソースレベルの情報(Caller属性)
- 軽量なメタプログラミングのシナリオ