显式和隐式c#

时间:2009-07-24 09:39:58

标签: c# dictionary implicit explicit

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

  

“隐含的东西以间接方式表达。”

     

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

  

“明确表达或显示的东西清楚公开,没有任何隐藏任何东西”

     

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

我想在C#中理解它。

感谢您的帮助。

干杯


其他信息:

这是书中句子的一部分,我正在阅读的内容中有“隐含”这个词

  

“这意味着AreaPerPerson( ) 中的区域和居住者隐式是指在调用AreaPerPerson( )的对象中找到的那些变量的副本”

我完全不明白这句话试图说的是什么。

8 个答案:

答案 0 :(得分:107)

在声明转化运算符时,会使用C#中的implicitexplicit个关键字。假设你有以下课程:

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

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

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

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

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";

答案 1 :(得分:56)

一般

  • 隐含:自动为你做了一些事。
  • 明确:你在源代码中写了一些东西来表明你想要发生什么。

例如:

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

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

请注意,偶尔两人可以聚在一起。例如:

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

(显式转换是具有明确指定的转换;隐式版本是可以隐式使用的转换,即没有代码必须声明它。 )

答案 2 :(得分: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;
    }
}

和两个对象:

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

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

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

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

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

答案 3 :(得分:2)

我认为this link非常清楚隐含转换是什么 - 它是您不需要在赋值中显式转换值的转换。所以,而不是做

myDigit = (Digit) myDouble 

......你可以这样做:

myDigit = myDouble;

答案 4 :(得分:1)

在C#中明确表达主要是清楚明确地表达你的意图。

例如:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

在上面的代码中,隐含了类,字段和方法的可见性。它们使用编译器默认值。

现在,我永远无法记住编译器的默认设置,也许你的同事也不能,所以不要依赖每个人记住默认设置,你可以明确。

public class MyClass
{
    private string myField;

    public void MyMethod(int someNumber)
    {
    }
}

答案 5 :(得分: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

答案 6 :(得分: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;
}

答案 7 :(得分:-1)

这是学习C#的绝佳资源:http://www.functionx.com/csharp/

具体看一下:http://www.functionx.com/csharp/math/Lesson20.htm