77

私はC#に不慣れで、新しい単語を学んでいます。c#のプログラミングに関して、これら2つの単語の意味を理解するのは難しいと思います。私は辞書で意味を調べました、そしてこれが私が得たものです:

暗黙

「暗黙の何かは間接的な方法で表現されます。」

「品質または要素が何かに暗黙のうちに含まれている場合、それはそれに関与しているか、それによって示されます。」

明示的

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

「あなたが何かについて明白であるならば、あなたはそれについて非常に率直にそしてはっきりと話します。」

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

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

乾杯


追加情報:

これが私が今読んでいる本の文章の一部で、この単語は「暗黙的」です。

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

私はここでこの文が何を言おうとしているのか全く理解していません。

4

8 に答える 8

141

C#のimplicitandexplicitキーワードは、変換演算子を宣言するときに使用されます。次のクラスがあるとします。

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

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

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

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

Role role = "RoleName";

これは、文字列を暗黙的にaに変換することを意味します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";
于 2009-07-24T09:47:56.430 に答える
66

一般に

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

例えば:

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!

(明示的な変換とは、明示的に指定する必要がある変換です。暗黙的なバージョンとは、暗黙的に使用できるバージョンです。つまり、コードで明示的に指定する必要はありません。)

于 2009-07-24T09:43:50.323 に答える
9

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

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

于 2009-07-24T09:45:52.690 に答える
2

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

myDigit = (Digit) myDouble 

...あなたはただすることができます:

myDigit = myDouble;
于 2009-07-24T09:44:40.027 に答える
1

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

例えば:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

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

今、私はコンパイラのデフォルトが何であるかを思い出せませんし、おそらくあなたの同僚も思い出せないので、デフォルトが何であるかをみんなが覚えていることに頼るのではなく、明示的にすることができます。

public class MyClass
{
    private string myField;

    public void MyMethod(int someNumber)
    {
    }
}
于 2009-07-24T09:44:07.407 に答える
0

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

int implicit;
implicit = 7.5;

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

ここに明示的です:

int explicit;
explicit = (int)7.5;

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

于 2016-08-17T00:52:54.087 に答える
0

C#はコンパイル時に静的に型付けされるためです。

暗黙的な変換:変換は常に成功し、データが失われることはないため、特別な構文は必要ありません。例としては、小さい整数型から大きい整数型への変換、派生クラスから基本クラスへの変換などがあります。

明示的な変換(キャスト):明示的な変換にはキャスト式が必要です。変換中に情報が失われる可能性がある場合、または他の理由で変換が成功しない可能性がある場合は、キャストが必要です。典型的な例には、精度が低いか範囲が狭い型への数値変換、および基本クラスインスタンスの派生クラスへの変換が含まれます。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public static explicit operator Person(Employe employe) => new Person { Id = employe.Id, Name = employe.Name };
}

public class Employe
{

    public int Id { get; set; }
    public string Name { get; set; }
    public string Family { get; set; }

    public static implicit operator Employe(Person person) => new Employe { Id = person.Id, Name = person.Name };
}

static void Main(string[] args)
{
    Person person = new Person() { Id = 1, Name = "Reza" };

    //implicit operator
    Employe employe = person;
    employe.Family = "Jenabi";

    //explicit operator
    Person person1 = (Person)employe;
}
于 2020-10-02T11:23:10.220 に答える
0

Microsoftのコードジェネレーターは暗黙的にキーワード「var」を使用しますが、注意することが重要だと思います。

var builder = WebApplication.CreateBuilder(args);

WebApplicationBuilder? builder = WebApplication.CreateBuilder(args); 

同じですが

var builder = WebApplication.CreateBuilder(args);

WebApplicationBuilder builder = WebApplication.CreateBuilder(args); 

同じではありません。

コードを明確にするために、私は常にExplicitを好みますが、ご覧のとおり、Microsoftのコードジェネレーターはそうではありません。コード実行の観点からは、パフォーマンスの違いはありません。

于 2022-03-04T19:17:38.023 に答える