我有以下代碼,它會告訴我某個屬性是否在代碼的其他地方使用。這背後的想法是驗證是否只能使用private
設置者進行只讀屬性。爲什麼ReSharper告訴我這個表達總是對的?
這裏有幾個陷阱,但主要的是對構造函數外的屬性賦值意味着它不會觸發。此外,靜態屬性可能只有在靜態構造函數中才能觸發診斷。同樣,一個實例屬性只需要一個實例構造函數。
現在,我到目前爲止的大多數場景都被佔了,但ReSharper在這段代碼中給了我一個警告,我似乎無法弄清楚它的邏輯。上述規範在此位的代碼翻譯:
var isStaticProperty = propertySymbol.IsStatic;
bool hasInstanceUsage = false;
bool hasStaticUsage = false;
foreach (var identifier in outerClass.DescendantNodes().OfType<IdentifierNameSyntax>())
{
var memberSymbol = context.SemanticModel.GetSymbolInfo(identifier);
if (memberSymbol.Symbol.Equals(propertySymbol))
{
var constructor = identifier.Ancestors().OfType<ConstructorDeclarationSyntax>()
.FirstOrDefault();
var isInConstructor = constructor != null;
var isAssignmentExpression = identifier.Ancestors()
.OfType<AssignmentExpressionSyntax>()
.FirstOrDefault() != null;
// Skip anything that isn't a setter
if (!isAssignmentExpression)
{
continue;
}
// if it is a setter but outside the constructor, we don't report any diagnostic
if (!isInConstructor)
{
return;
}
var isStaticConstructor = context.SemanticModel
.GetDeclaredSymbol(constructor).IsStatic;
if (isStaticConstructor && isStaticProperty)
{
hasStaticUsage = true;
}
if (!isStaticConstructor && !isStaticProperty)
{
hasInstanceUsage = true;
}
}
}
// We can't set it to readonly if it's set in both the instance
// and the static constructor
// We need a NAND operation: either it's never set,
// it's set in ctor 1 or it's set in ctor 2
if (!(hasStaticUsage & hasInstanceUsage))
{
context.ReportDiagnostic(Diagnostic.Create(
Rule, property.Identifier.GetLocation(), propertySymbol.Name));
}
與警告是
表達始終是真實的
上線
if (!(hasStaticUsage & hasInstanceUsage))
爲什麼它顯示這個警告?有一個未知數量的後代,所以有一個未知量的循環。每個環可以設置hasStaticUsage
或hasInstanceUsage
到true
,這意味着後2個循環(在最早),這兩個值可以成爲true
和如果條件應失敗:一個NAND返回true
,true
,true
,false
。
這是布爾邏輯,我打算做到:
+----------------+------------------+--------+
| hasStaticUsage | hasInstanceUsage | result |
+----------------+------------------+--------+
| false | false | true |
| false | true | true |
| true | false | true |
| true | true | false |
+----------------+------------------+--------+
凡'isStaticProperty'初始化? –
在'hasInstanceUsage'的同一級別。爲了完整起見,我會將其納入其中,但我認爲它沒有影響。 –
'我有以下代碼會告訴我某個屬性是否在代碼的其他地方使用 - - 這不是VS中的本地特性嗎? – Davor