c#将var声明为接口.为什么这是可能的
本文关键字:为什么 接口 var 声明 | 更新日期: 2023-09-27 18:13:08
我真的不能理解这个概念。
假设我有这个接口:
public interface IValidate
{
Dictionary<eValidationErrors, List<string>> ValidationMessages { get; }
}
当我说:
var Validator = control as IValidate;
Validator.ValidationMessages.Add(key,list);
Validator是什么?为什么我可以这样使用接口?
谢谢
Validator
是实现IValidate
接口类型的实例(如果control
实例不实现IValidate
接口,则为空)
如果您对某个实例的实际或精确实现不感兴趣,但如果您想使用接口提供的特性,那么这样做是很有帮助的。
想想。net框架中的一些方法,它们接受接口类型的参数。该方法对类型本身不感兴趣;它只需要确保传递的参数具有特定的方法/属性等…
as
运算符将右侧转换为IValidate
,因此Validator
类型为IValidate
。
换句话说,你的代码与:
IValidate Validator = control as IValidate;
你的问题似乎是
为什么我可以这样使用接口?
但是我不明白为什么你认为这段代码会以其他方式表现。可能脱节的原因是您还不熟悉c#中var
的使用。如果是这样的话,我相信快速阅读一下文档就会明白了。
可以给局部变量一个var的推断"类型",而不是一个显式的类型。var关键字指示编译器从初始化语句右侧的表达式推断变量的类型。
请注意,var
变量和显式类型变量在类型安全方面没有区别。
在任何给定的时刻,Validator将不保存任何内容(空值),或者是实现IValidate的某种类型的实例,它可以被当作IValidate的实例使用。要使用一个更类似于抽象类,但涉及相同原则的示例,请考虑以下请求:
- 如果一辆车辆在下午6点到早上8点之间停在该位置,Tow(拖车)将对其进行检测。给我一辆新的车。
假设每个Vehicle都有一个Tow()方法,那么第一个请求中的Vehicle类型就足以描述该方法。另一方面,第二种方法中的Vehicle类型太模糊而无法使用。如果提供了具有相关默认参数的类型,则不必提供所需对象的绝对完整描述。例如,如果指定了ToyotaCamry,则该类型可能具有相关联的默认年份、颜色、车身样式、选项包等。另一方面,仅仅说想要一个Vehicle就太开放了。
您可以使用它作为控件对象实现IValidate。因此,使用var可以将该对象的接口部分放入Validator。
var
表示类型将具有隐式类型。重要的是要理解var关键字并不意味着"变体",也不表示变量是松散类型的,或延迟绑定的。它只是意味着编译器决定并赋值最合适的类型。
所以如果你使用var Validator = control as IValidate;
, Validator的类型将是IValidate
接口通常表示与对象通信的协议。因此,通过将对象强制转换为接口,您符合该协议,因此您只能调用它的公开声明的成员。