显式和隐式c#

tin*_*tes 59 c# dictionary explicit implicit

我是C#的新手并且学习新单词.在编程c#时,我发现很难理解这两个词的含义是什么.我在字典中查找了含义,这是我得到的:

含蓄

"隐含的东西是间接表达的."

"如果一个品质或元素隐含在某个东西中,它就会参与其中或由它展示;"

明确的

"明确表达或展示的东西清楚公开,没有任何隐藏任何东西的企图"

"如果你明确表达某些事情,那么你就会公开而清楚地谈论它."

我想在C#中理解它.

谢谢你的帮助.

干杯


附加信息:

这是我正在阅读的书中的一部分句子,其中有"隐含"这个词

"这意味着里面的区域和占用者AreaPerPerson( ) 隐含地引用在调用的对象中找到的那些变量的副本AreaPerPerson( )"

我完全不明白这句话试图说什么.

Fre*_*örk 115

声明转换运算符时使用C#中的implicitexplicit关键字.假设您有以下课程:

public class Role
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果你想创建一个新的Role并为其分配一个Name,你通常会这样做:

Role role = new Role();
role.Name = "RoleName";
Run Code Online (Sandbox Code Playgroud)

由于它只有一个属性,如果我们可以这样做,它可能会很方便:

Role role = "RoleName";
Run Code Online (Sandbox Code Playgroud)

这意味着我们希望隐式地将字符串转换为a Role(因为代码中没有特定的转换).为此,我们添加了一个隐式转换运算符:

public static implicit operator Role(string roleName)
{
    return new Role() { Name = roleName };
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是实现显式转换运算符:

public static explicit operator Role(string roleName)
{
    return new Role() { Name = roleName };
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们不能将字符串隐式转换为a Role,但我们需要在代码中强制转换它:

Role r = (Role)"RoleName";
Run Code Online (Sandbox Code Playgroud)

  • @tintincute:很少!自定义转换只是非常有用,就像用户定义的运算符一样. (8认同)
  • 非常感谢!我有时难以理解技术术语.这是非常好的解释.再次感谢 (2认同)

Jon*_*eet 56

一般来说

  • 隐含的:自动为你做的事情.
  • 明确:您在源代码中写了一些内容,以表明您想要发生的事情.

例如:

int x = 10;
long y = x; // Implicit conversion from int to long
int z = (int) y; // Explicit conversion from long to int
Run Code Online (Sandbox Code Playgroud)

隐式和显式在不同的语境中使用相当多,但一般意义总是沿着这些方向.

请注意,偶尔两者可以结合在一起.例如:

int x = 10;
long y = (long) x; // Explicit use of implicit conversion!
Run Code Online (Sandbox Code Playgroud)

(显式转换是必须明确说明的转换;隐式版本是可以隐式使用的版本,即代码不必声明它.)


mac*_*kow 9

考虑你有两个类:

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


internal class Implicit
{
    public static implicit operator int(Implicit a)
    {
        return 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

和两个对象:

var obj1 = new Explicit();
var obj2 = new Implicit();
Run Code Online (Sandbox Code Playgroud)

你现在可以写:

int integer = obj2; // implicit conversion - you don't have to use (int)
Run Code Online (Sandbox Code Playgroud)

要么:

int integer = (int)obj1; // explicit conversion
Run Code Online (Sandbox Code Playgroud)

但:

int integer = obj1; // WON'T WORK - explicit cast required
Run Code Online (Sandbox Code Playgroud)

当转换没有失去任何精度时,意味着使用隐式转换.显式转换意味着你可以放松一些精确度,并且必须清楚地说明你知道自己在做什么.

还有第二个上下文,其中应用了隐式/显式术语 - 接口实现.在这种情况下没有关键字.

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
Run Code Online (Sandbox Code Playgroud)

因此,当您使用显式接口实现时,在使用具体类型时,接口的方法不可见.这可以在接口是帮助程序接口时使用,而不是类主要负责的一部分,并且您不希望其他方法使用您的代码误导某人.