gpt4 book ai didi

c# - 代码合约警告

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:28 24 4
gpt4 key购买 nike

我有一个小实用类:

public static class SerializationUtilities
{
public static string ToXml<T>(T @object)
{
Contract.Requires<ArgumentNullException>(@object != null);
Contract.Requires<ArgumentException>(typeof(T).IsSerializable);
Contract.Ensures(!string.IsNullOrEmpty(Contract.Result<string>()));

var xs = new XmlSerializer(typeof(T));
var result = new StringBuilder();

using (var sw = new StringWriter(result))
{
xs.Serialize(sw, @object);
}
return result.ToString();
}

public static T FromXml<T>(string xml)
{
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(xml));
Contract.Ensures(!object.Equals(Contract.Result<T>(), default(T)));

var xs = new XmlSerializer(typeof(T));
using (var sr = new StringReader(xml))
{
return (T)xs.Deserialize(sr);
}
}
}

这两种方法都按预期工作。

但是,代码契约静态检查器抛出两个警告:

Warning 30 CodeContracts: ensures unproven: !string.IsNullOrEmpty(Contract.Result())

Warning 28 CodeContracts: ensures unproven: !object.Equals(Contract.Result(), default(T))

为什么发出这些警告?将我的方法契约化的正确(最佳?)方法是什么?

最佳答案

您的 Contract.Ensures() 不能这么严格。

大多数框架方法都没有用契约修饰。您不能确定 StringBuilder.ToString() 不会返回空字符串,因为没有关于 XmlSerializer.Serialize() 将做什么的信息。反序列化相同:没有信息断言 XmlSerializer.Deserialize() 不会返回 default(T) 对象。

正如@TrustMe-ImADoctor 在评论中指出的那样,您可能必须在代码中为该断言添加额外的检查,然后静态分析将发现该案例已得到处理且不可能。我想您不需要通过更多检查来污染您的代码,对于这种互操作情况,您可以只使用 Contract.Assume()

关于c# - 代码合约警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11047642/

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