最近の回答の1つで使用されているのを見ました:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
ここで暗黙という言葉が必要なのはなぜですか? また、それはどういう意味ですか?
最近の回答の1つで使用されているのを見ました:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
ここで暗黙という言葉が必要なのはなぜですか? また、それはどういう意味ですか?
暗黙的とは、コード内で変換にキャストが必要ないことを意味します。
これを行うことができます:
Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}
これを行う代わりに:
Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}
これが有用な区別である理由の 1 つの例は、数値型です。「小さい」タイプから「大きい」タイプへの暗黙的な変換があります。次に例を示します。
float f = 6.5;
double d = f; // implicit conversion
ただし、大きな型を小さな型に変換するのは危険な場合があるため、明示的な変換のみがあり、ユーザーは問題の操作を本当に実行するつもりであることを明確にする必要があります。
long l = 20;
// short s = l;
short s = (short)l; // explicit conversion
これは暗黙の演算子の誤用のようです。Savepoint クラスが何をするのかはわかりませんが、ブール値に変換するのは論理的ではないようです。暗黙的な演算子を使用すると、参照を評価するだけで、セーブポイント参照が null かどうかを確認できます。
if (point) {
それ以外の:
if (point != null) {
そのように使用すると、コードが実際に行っていることが隠され、C# のほとんどすべてに反することになります。
mquanderの答えに追加するだけです。
C# 3.0 言語仕様から:
キーワードを含む変換演算子宣言は
implicit
、ユーザー定義の暗黙的な変換を導入します。暗黙的な変換は、関数メンバーの呼び出し、キャスト式、割り当てなど、さまざまな状況で発生する可能性があります。
(セクション 10.10.3)
変換演算子は、ある型から別の型に変換します。暗黙的とは、変換を行うためにコードで明示的なキャストを入力する必要がないことを意味し、明示的とは、コードでそのキャストを呼び出す必要があることを意味します。
変換によってデータが失われないことが確実な場合は、暗黙的な変換演算子を使用します。たとえば、拡張強制 (int -> long、float -> double) を使用します。明示的な変換演算子は、一部の状態が失われる場合、またはコンパイラがあちこちに変換を挿入してクライアント コードを自動的に台無しにしたくない場合に使用されます。
この特定の変換を実行することはお勧めできないため、あなたのような変換は本当に大混乱を引き起こします。
明示的な演算子もあるため、'implicit' を指定する必要があります。
これは、ブール値とセーブポイントの間の変換を暗黙的に行うことができることを意味します (例: = hidden)。
Savepoint s = new Savepoint();
bool b = s;
明示的な変換 (evidual など) は、次の方法で行うことができます。
Savepoint s = new Savepoint();
bool b = (bool)s;
暗黙的な変換は、データ損失の可能性がない場合、つまりInt16 (short)
to によく使用されInt32 (int)
ます。ただし、可能であれば、明示的な変換を使用して「同意」する必要があります。
あなたの場合、たとえば、 ifSavepoint
は単なる
struct Savepoint
{
public bool data;
}
データが失われる可能性がないため、暗黙的な変換を使用できます。
Savepoint s = new Savepoint();
s.data = true;
bool b = s;
それ以外の場合は、明示的な演算子を定義することをお勧めします!