gpt4 book ai didi

.net - ParameterInfo.IsOptional 和 ParameterInfo.HasDefaultValue 之间的区别?

转载 作者:行者123 更新时间:2023-12-04 02:10:12 24 4
gpt4 key购买 nike

他们两个听起来很相似。来自 msdn:

ParameterInfo.IsOptional

Gets a value indicating whether this parameter is optional.

This method depends on an optional metadata flag. This flag can be inserted by compilers, but the compilers are not obligated to do so.

This method utilizes the Optional flag of the ParameterAttributes enumerator.



ParameterInfo.HasDefaultValue (.NET 4.5 中的新功能)

Gets a value that indicates whether this parameter has a default value.



他们不是一样的吗?我做了快速测试:
public void A(string value)
{

}
public void B(string value, int i = -1)
{

}

我写:
var a = AInfo.GetParameters().Select(p => p.HasDefaultValue).ToArray();
var b = AInfo.GetParameters().Select(p => p.IsOptional).ToArray();

var c = BInfo.GetParameters().Select(p => p.HasDefaultValue).ToArray();
var d = BInfo.GetParameters().Select(p => p.IsOptional).ToArray();

//a equals b; and c equals d

那么它们在哪些上下文中有所不同呢? BCL为何推出 HasDefaultValue在 .NET 4.5 新?

最佳答案

如果我们看一下 IsOptional 的实现我们会看到:

public bool IsOptional
{
[__DynamicallyInvokable] get
{
return (this.Attributes & ParameterAttributes.Optional) != ParameterAttributes.None;
}
}

它取决于元数据标志,但正如它在 msdn 中所写的那样:

This method depends on an optional metadata flag. This flag can be inserted by compilers, but the compilers are not obligated to do so.



这意味着它取决于编译器,如果我们使用其他编译器,我们可以获得具有默认值的参数不会有 IsOptional旗帜。
现在让我们看看 HasDefaultValue 属性是如何实现的:
public override bool HasDefaultValue
{
get
{
if (this.m_noMetadata || this.m_noDefaultValue)
return false;
else
return this.GetDefaultValueInternal(false) != DBNull.Value;
}
}

它始终检查参数是否具有默认值并且不依赖于编译器。这可能不是 100% 正确的答案,只是我的想法。

更新 0

这是参数没有默认值而是 IsOptional 的示例是真的:
public static void Method([Optional]string parameter)
{
}

ParameterInfo parameterInfo = typeof(Program).GetMethod("Method").GetParameters()[0];
//Is true
bool isOptional = parameterInfo.IsOptional;
//Is false
bool hasDefaultValue = parameterInfo.HasDefaultValue;

关于.net - ParameterInfo.IsOptional 和 ParameterInfo.HasDefaultValue 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16186694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com