我是C#的新手并且学习新单词。在编程c#时,我发现很难理解这两个词的含义是什么。 我在字典中查找了含义,这是我得到的:
隐
“隐含的东西以间接方式表达。”
“如果一个品质或元素隐含在某个东西中,它就会参与其中或由它展示;”
显
“明确表达或显示的东西清楚公开,没有任何隐藏任何东西”
“如果你明确表达某些事情,那么你就会公开而清楚地谈论它。”
我想在C#中理解它。
感谢您的帮助。
干杯
其他信息:
这是书中句子的一部分,我正在阅读的内容中有“隐含”这个词
“这意味着
AreaPerPerson( )
中的区域和居住者隐式是指在调用AreaPerPerson( )
的对象中找到的那些变量的副本”
我完全不明白这句话试图说的是什么。
答案 0 :(得分:107)
在声明转化运算符时,会使用C#中的implicit
和explicit
个关键字。假设你有以下课程:
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)