Ich habe eine Klasse mit einem Member, die ich für Legacy-Code behalten muss, und ich muss es als veraltet markieren, damit neuer Code es nicht verwendet (ohne eine Warnung).Veraltetes Mitgliedsfeld mit Eigenschaft Accessor (Visual Studio Bug)
Sagen wir, die Klasse wie folgt aussieht:
class MyClass
{
[Obsolete]
private string _old = "...";
[Obsolete]
public string Old
{
get { return _old; }
}
}
Ich erkläre, dass das Mitglied Feld _old
veraltet ist, um sicherzustellen, dass neue Code innerhalb der Klasse nicht das Feld verwenden.
Ich erkläre auch, dass die Eigenschaft Old
veraltet ist, um sicherzustellen, dass Code außerhalb der Klasse nicht die Eigenschaft verwenden.
Wenn ich dies kompiliere bekomme ich eine Warnung in der Eigenschaft Getter sagen, dass _old
veraltet ist. Ich dachte, dass der Compiler dies ignorieren würde, da die Eigenschaft selbst veraltet ist.
Fehle ich etwas oder muss ich #pragma warning disable/restore
für veraltete Mitgliedsfelder überall dort hinzufügen, wo sie verwendet werden (obwohl die Methode/Eigenschaft selbst als veraltet markiert ist)?
Der Grund, dass "Ich dachte, dass der Compiler diese leise ignorieren würde", weil es so für veraltete Klassen zu tun scheint:
[Obsolete]
public class MyObsoleteClass
{
public string DoSomething()
{
// No warning here, since the class itself is obsolete
return new MyClass().Old;
}
}
Als @Heinzi beantwortet: diese scheint auf einen Fehler in Visual Studio zurückzuführen zu sein. Ich habe einen Bericht über connect eingereicht:
https://connect.microsoft.com/VisualStudio/feedback/details/1146809
Es stellt sich heraus, dass der Fehler in Visual Studio ist nicht nur beschränkt eine veraltete Feld von einer Eigenschaft zugreifen.
eine veraltete Eigenschaft von einer veralteten Methode Zugriff sollte keine Warnung ergeben:
public class Class2
{
[Obsolete]
public string Property { get; set; }
[Obsolete]
public void Method()
{
this.Property = "value"; // <-- Incorrect warning reported
}
}
Weder sollte so von einer anderen Klasse zu tun:
public class Class3
{
[Obsolete]
public string Property { get; set; }
}
public class Class4
{
[Obsolete]
public string Method()
{
return new Class3().Property; // <-- Incorrect warning reported
}
}
Interessanterweise funktioniert es in der folgenden Klasse und wenn Durch das Hinzufügen dieser Klasse werden die anderen Warnungen (von und Class2
) auf magische Weise verschwinden.
public class Class5
{
[Obsolete]
public void Method()
{
// No warning reported here, which is good.
// This magically makes the other warnings disappear too!
new Class2().Method();
}
}
Warum den (internen) Code nicht umgestalten, um das richtige interne Feld zu verwenden? Dann haben Sie die Warnung nur einmal (für die Eigenschaft), für die das Obsolete-Attribut bestimmt ist - externe Verwendung. – HimBromBeere
Ich muss das Feld behalten, wie es ist. Legacy-Code muss weiterhin verwendet werden. Dieser Code wird jedoch ebenfalls als veraltet markiert. Neuer Code soll die neuen Sachen benutzen, aber alter Code soll noch existieren und die alten Sachen benutzen können. –
"* Ich dachte, dass der Compiler dies ignorieren würde, da die Eigenschaft selbst veraltet ist. *" Was hat Sie dazu gebracht? Gibt es etwas in der Dokumentation, das dies anzeigt? –