gpt4 book ai didi

c# - 使用 string.IsNullOrWhiteSpace 时如何处理 Code Contracts 警告 CC1036?

转载 作者:IT王子 更新时间:2023-10-29 04:14:51 27 4
gpt4 key购买 nike

我有以下代码契约(Contract):

public void F(string x)
{
Contract.Requires(!string.IsNullOrWhiteSpace(x));

throw new NotImplementedException();
}

编译时,我收到以下警告:

warning CC1036: Detected call to method 'System.String.IsNullOrWhiteSpace(System.String)' without [Pure] in contracts of method [...]

如何处理?

奇怪的是,我还在使用 string.IsNullOrEmpty,它在其他契约(Contract)中也没有标记为 [Pure],而重写器确实没有问题。

我的合约重写器的版本是 1.9.10714.2。

这是我正在使用的 String 类实现的相关部分(从元数据中检索):

#region Assembly mscorlib.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll
#endregion

using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;
using System.Text;

namespace System
{
// Summary:
// Represents text as a series of Unicode characters.To browse the .NET Framework
// source code for this type, see the Reference Source.
[Serializable]
[ComVisible(true)]
public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string>, IEnumerable<char>, IEquatable<string>
{

// [...]

//
// Summary:
// [...]
public static bool IsNullOrEmpty(string value);
//
// Summary:
// [...]
public static bool IsNullOrWhiteSpace(string value);

为什么缺少 [Pure] 属性?

最佳答案

这里有两点:

<强>1。为什么 IsNullorWhiteSpace 函数的字符串类中缺少 [Pure] 属性?

<强>2。如何解决 CC1030 警告问题?

我会尝试讨论两者。

1. Why is the [Pure] attribute missing? It's not missing, metadata does not seem to be showing this.

这在以前版本的 .NET FX 中可能未标记为 Pure,因为他们说:

Yes, we need to make our checker sensitive to the disable pragma...

叹息。

We currently don't have that implemented, but I've added it to our work list.

引用5年前的讨论here .

但这在最新的 FX (4.6.1) 中已被标记为 Pure,请引用 .NET Framework 4.6.1,新的 string class code .

[Pure]
public static bool IsNullOrWhiteSpace(String value) {
if (value == null) return true;

for(int i = 0; i < value.Length; i++) {
if(!Char.IsWhiteSpace(value[i])) return false;
}

return true;
}

那为什么是 CC1036?

此警告“CC1036”来自 CodeContracts,开发人员昨天才打开此问题 (refer here)。

现在为什么元数据没有吐出 Pure 属性,这是一个不同的问题,比如对于 Equals 方法,添加了 Pure 但仅SecuritySafeCritical 显示在元数据代码中。

[SecuritySafeCritical]
public static bool Equals(String a, String b, StringComparison comparisonType);

The same problem applies to Invariant(). Given the following code, the same warnings are displayed:

private string testString = "test";

[ContractInvariantMethod]
private void TestInvariant()
{
Contract.Invariant(!string.IsNullOrWhiteSpace(testString));
}

如何解决?

正如其他人也建议的那样,创建另一个方法,将其标记为 Pure 并在您的契约(Contract)条件中调用它。

关于c# - 使用 string.IsNullOrWhiteSpace 时如何处理 Code Contracts 警告 CC1036?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612382/

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