Archiwa tagu: c#

Obsolete/Deprecated dla metod w C#

Jeżeli chcesz oznaczyć metodę klasy w C# jako przestarzałą/wycofywaną, można do tego użyć atrybutu metody Obsolete

Przykład:


[Obsolete("Przyczyna wycofania metody")]
public static string Build(string url) {
[...]

Takie oznaczenie metody spowoduje przy każdym jej użyciu w kodzie wyświetlenie przez kompilator ostrzeżenia (warning), które wyglądać może np. tak:

Obsolete/Deprecated w C#

Argument atrybutu pozwala poinformować użytkowników Twojego kodu dlaczego metoda jest wycofywana

Zastosowanie opisanego atrybutu ma jeszcze jeden przyjemny „skutek uboczny”. w przypadku takich definicji metod (przeciążenie – overload):


public string Build(string u, params object[] parameters) { [...] }
public string Build(string u, params UrlParam[] parameters) { [...] }

wycofanie drugiej metody poprzez jej usunięcie z klasy nie spowoduje przekazania żadnej informacji ze strony kompilatora, chociaż potencjalnie może być katastrofalne w skutkach wobec kodu. Oznaczenie jej natomiast jako Obsolete pozwala bezpiecznie znaleźć i zmienić wszystkie wystąpienia w kodzie.

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)

Ambiguity between method and non-method. Using method group.

Przy korzystaniu z mechanizmów automatyzacji aplikacji Office w C# pojawić może się ostrzeżenie:

Ambiguity between method 'Microsoft.Office.Interop.Word._Document.Close(ref object, ref object, ref object)' and non-method 'Microsoft.Office.Interop.Word.DocumentEvents2_Event.Close'. Using method group.

Problem taki pojawi się np. w następującym kodzie:


using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;

[...]

Application wordApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application", true), true) as Application;
object missingValue = Missing.Value;
object saveChanges = false;

[...]

wordApplication.Quit(ref saveChanges, ref missingValue, ref missingValue);

Przyczynę niejednoznaczności (ang. ambiguity) odnajdziemy zaglądając do definicji interfejsu Application:


using System.Runtime.InteropServices;

namespace Microsoft.Office.Interop.Word {
[Guid("00020970-0000-0000-C000-000000000046")]
[CoClass(typeof(ApplicationClass))]
public interface Application: _Application, ApplicationEvents4_Event {
}
}

i dalej w interfejsach po których dziedziczy Microsoft.Office.Interop.Word.Application:

w Microsoft.Office.Interop.Word._Application

[DispId(1105)]
void Quit(ref object SaveChanges, ref object OriginalFormat, ref object RouteDocument);

a w Microsoft.Office.Interop.Word.ApplicationEvents4_Event

event ApplicationEvents4_QuitEventHandler Quit;

Widać więc, że interfejsy te zawierają powielone nazwy odnoszące się do różnych składowych.
Podobny problem dotyczy także innych metod wywoływanych na rzecz obiektów automatyzacji, np. metody Close.

Prostym rozwiązaniem umożliwiającym pozbycie się niepotrzebnego ostrzeżenia jest jawne rzutowanie na właściwy interfejs, z którego nazwy chcemy użyć, czyli linię powodującą warning:

wordApplication.Quit(ref saveChanges, ref missingValue, ref missingValue);

wystarczy zamienić na:

(wordApplication as _Application).Quit(ref saveChanges, ref missingValue, ref missingValue);

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)