显式和隐式的c#
我是C#的新手,学习新单词。 我发现在编程c#时很难理解这两个词的含义。 我看了字典的意思,这里是我得到的:
含蓄
“隐含的东西是以间接的方式expression的。”
“如果一个质量或要素隐含在某件事物中,它就涉及到它或者被它所performance出来;”
明确的
“明确而明确地expression或明确expression某种东西,而不是试图隐藏任何东西”
“如果你对某件事情很清楚,你可以非常坦率地说清楚。”
我想在C#中理解它。
谢谢你的帮助。
干杯
附加信息:
这里是我正在阅读的书中的一个句子的一部分,它有这个词“隐含”
“这意味着
AreaPerPerson( )
中的Area和AreaPerPerson( )
隐含地引用了在调用AreaPerPerson( )
的对象中find的那些variables的副本”
我完全不明白这句话在这里想说什么。
在声明转换运算符时,使用C#中的implicit
和explicit
关键字。 假设您有以下课程:
public class Role { public string Name { get; set; } }
如果你想创build一个新的Role
并给它分配一个Name
,你通常会这样做:
Role role = new Role(); role.Name = "RoleName";
既然它只有一个属性,如果我们可以这样做,也许会很方便:
Role role = "RoleName";
这意味着我们想隐式地将一个string转换为一个Role
(因为代码中没有特定的转换)。 为了达到这个目的,我们添加一个隐式转换运算符:
public static implicit operator Role(string roleName) { return new Role() { Name = roleName }; }
另一个select是实现一个显式的转换操作符:
public static explicit operator Role(string roleName) { return new Role() { Name = roleName }; }
在这种情况下,我们不能将string隐式转换为Role
,但是我们需要将其转换为我们的代码:
Role r = (Role)"RoleName";
一般来说
- 隐含的:自动完成一些事情。
- 显式的:你已经在源代码中写了一些东西来表明你想要发生什么。
例如:
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!
(显式转换必须明确说明;隐式转换是隐式使用的,也就是说,代码不需要声明它)。
考虑你有两个类:
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
所以当你使用显式的接口实现的时候,当你使用具体types的时候,接口的方法是不可见的。 当接口是辅助接口时,可以使用它,而不是类的主要责任的一部分,并且您不希望使用其他方法误导使用您的代码的用户。
我认为这个链接很清楚隐式转换是什么 – 这是一个你不需要在赋值中明确地转换值的地方。 所以,而不是做
myDigit = (Digit) myDouble
…你可以做:
myDigit = myDouble;
在C#中明确主要是清楚明确地显示你的意图。
例如:
class MyClass { string myField; void MyMethod(int someNumber) { } }
在上面的代码中,类,字段和方法的可见性都是隐含的。 他们使用编译器的默认值。
现在,我永远不会记得编译器的默认值是什么,也可能是你的同事不能,所以不要依赖每个人记住默认值,你可以是明确的。
public class MyClass { private string myField; public void MyMethod(int someNumber) { } }
隐含可以被认为是隐含的,但明确的意思是说你必须自己完成它。 像演员一样。 这是一个隐含的演员:
int implicit; implicit = 7.5;
值“7.5”将隐式地被转换为int。 这意味着编译器为你做。
这里是明确的:
int explicit; explicit = (int)7.5;
在这里,你告诉编译器你想要投射。 您显式声明转换。 希望有所帮助。 资料来源: http : //cboard.cprogramming.com/cplusplus-programming/24371-implicit-explicit.html
这是学习C#的一个很好的资源: http : //www.functionx.com/csharp/
请特别看看这里: http : //www.functionx.com/csharp/math/Lesson20.htm