web-dev-qa-db-ja.com

明示的および暗黙的なc#

私はC#が初めてで、新しい単語を学んでいます。 C#のプログラミングに関しては、これら2つの単語の意味を理解するのは難しいと感じています。辞書でその意味を調べたところ、次のようになりました。

暗黙

「暗黙的なものは間接的に表現されます。」

「品質または要素が何かに暗黙的である場合、それはそれに関与するか、それによって示されます。」

明示的

「明示的なものは、何も隠そうとせずに、明確かつオープンに表現または表示されます」

「何かについて明示的なことをしたら、あなたはそれについて非常に率直かつ明確に話す。」

C#でそれを理解したいと思います。

ご協力いただきありがとうございます。

乾杯


追加情報:

ここに私が今読んでいる本の文章の一部があります。

「これは、AreaPerPerson( )内のAreaとOccupantsが、暗黙的にAreaPerPerson( )を呼び出すオブジェクトで見つかった変数のコピーを参照することを意味します。」

ここでこの文が何を言おうとしているのか、私にはまったくわかりません。

57
tintincutes

C#の implicit および explicit キーワードは、変換演算子を宣言するときに使用されます。次のクラスがあるとしましょう:

public class Role
{
    public string Name { get; set; }
}

新しいRoleを作成し、それにNameを割り当てる場合、通常は次のようにします。

Role role = new Role();
role.Name = "RoleName";

プロパティは1つしかないため、代わりに次のようにできると便利でしょう。

Role role = "RoleName";

これは、暗黙的に文字列をRoleに変換することを意味します(コードには特定のキャストがないため)。これを実現するために、暗黙的な変換演算子を追加します。

public static implicit operator Role(string roleName)
{
    return new Role() { Name = roleName };
}

別のオプションは、明示的な変換演算子を実装することです:

public static explicit operator Role(string roleName)
{
    return new Role() { Name = roleName };
}

この場合、文字列を暗黙的にRoleに変換することはできませんが、コードでキャストする必要があります。

Role r = (Role)"RoleName";
110
Fredrik Mörk

一般に

  • 暗黙:何かが自動的に行われます。
  • 明示的:発生したいことを示すために、ソースコードに何かを記述しました。

例えば:

int x = 10;
long y = x; // Implicit conversion from int to long
int z = (int) y; // Explicit conversion from long to int

暗黙的および明示的は異なるコンテキストで非常に多く使用されますが、一般的な意味は常にそれらの線に沿っています。

時々、2つが一緒になることがあることに注意してください。例えば:

int x = 10;
long y = (long) x; // Explicit use of implicit conversion!

(明示的な変換とはhasを明示的に指定するものです;暗黙的なバージョンとはcanを暗黙的に使用するものです。つまり、コードを記述する必要はありません。)

56
Jon Skeet

次の2つのクラスがあるとします。

internal class Explicit
{
    public static explicit operator int (Explicit a)
    {
        return 5;
    }
}


internal class Implicit
{
    public static implicit operator int(Implicit a)
    {
        return 5;
    }
}

および2つのオブジェクト:

var obj1 = new Explicit();
var obj2 = new Implicit();

あなたは今書くことができます:

int integer = obj2; // implicit conversion - you don't have to use (int)

または:

int integer = (int)obj1; // explicit conversion

だが:

int integer = obj1; // WON'T WORK - explicit cast required

暗黙的な変換は、変換によって精度が失われない場合に使用されることを意図しています。明示的な変換とは、ある程度の精度を失う可能性があり、何をしているのかを知っていることを明確に述べなければならないことを意味します。

また、暗黙的/明示的な用語が適用される2番目のコンテキスト、インターフェイスの実装もあります。その場合、キーワードはありません。

internal interface ITest
{
    void Foo();
}

class Implicit : ITest
{
    public void Foo()
    {
        throw new NotImplementedException();
    }
}

class Explicit : ITest
{
    void ITest.Foo() // note there's no public keyword!
    {
        throw new NotImplementedException();
    }
}

Implicit imp = new Implicit();
imp.Foo();
Explicit exp = new Explicit();
// exp.Foo(); // won't work - Foo is not visible
ITest interf = exp;
interf.Foo(); // will work

したがって、明示的なインターフェイスの実装を使用する場合、具象型を使用すると、インターフェイスのメソッドは表示されません。これは、インターフェイスがクラスの主要な責任の一部ではなくヘルパーインターフェイスであり、コードを使用している人を誤解させる追加のメソッドが必要ない場合に使用できます。

9
maciejkow

このリンク は暗黙の変換が何であるかをかなり明確にしていると思います-割り当ての値を明示的にキャストする必要のない変換です。だから、代わりに

myDigit = (Digit) myDouble 

...次のことができます:

myDigit = myDouble;
2
Gary McGill

C#で明示的であるとは、主に意図を明確かつ明確に示すことです。

例えば:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

上記のコードでは、クラス、フィールド、およびメソッドの可視性がすべて暗示されています。コンパイラのデフォルトを使用します。

今、私はコンパイラのデフォルトが何であるかを決して思い出せず、おそらくあなたの同僚も思い出せないかもしれません。

public class MyClass
{
    private string myField;

    public void MyMethod(int someNumber)
    {
    }
}
1
Colin Mackay

暗黙的は暗黙的と見なすことができますが、明示的とは、自分で行う必要があると述べることを意味します。キャストのように。暗黙的なキャストは次のとおりです。

int implicit;
implicit = 7.5;

値「7.5」は暗黙的にintとしてキャストされます。これは、コンパイラがあなたのためにそれを行うことを意味します。

明示的です:

int explicit;
explicit = (int)7.5;

ここで、コンパイラにキャストすることを伝えます。変換を明示的に宣言します。お役に立てば幸いです。ソース: http://cboard.cprogramming.com/cplusplus-programming/24371-implicit-explicit.html

0
Roque Mejos