여기에 경고와 그 이유를 설명하는 몇 가지 좋은 답변이 이미 있습니다. 이러한 유형 중 일부는 제네릭 형식의 정적 필드를 갖는 것이 일반적으로 실수 입니다.
이 기능이 어떻게 유용 할 수 있는지, 예를 들어 R # 경고를 억제하는 것이 좋은지에 대한 예를 추가한다고 생각했습니다.
Xml과 같이 직렬화하려는 엔터티 클래스 집합이 있다고 가정하십시오. 을 사용하여이 직렬 변환기를 작성할 수 new XmlSerializerFactory().CreateSerializer(typeof(SomeClass))
있지만 각 유형마다 별도의 직렬 변환기를 작성해야합니다. 제네릭을 사용하면 다음과 같이 대체 할 수 있으며 엔터티가 파생 할 수있는 제네릭 클래스에 배치 할 수 있습니다.
new XmlSerializerFactory().CreateSerializer(typeof(T))
특정 유형의 인스턴스를 직렬화해야 할 때마다 새 직렬 변환기를 생성하지 않으려는 경우 다음을 추가 할 수 있습니다.
public class SerializableEntity<T>
{
// ReSharper disable once StaticMemberInGenericType
private static XmlSerializer _typeSpecificSerializer;
private static XmlSerializer TypeSpecificSerializer
{
get
{
// Only create an instance the first time. In practice,
// that will mean once for each variation of T that is used,
// as each will cause a new class to be created.
if ((_typeSpecificSerializer == null))
{
_typeSpecificSerializer =
new XmlSerializerFactory().CreateSerializer(typeof(T));
}
return _typeSpecificSerializer;
}
}
public virtual string Serialize()
{
// .... prepare for serializing...
// Access _typeSpecificSerializer via the property,
// and call the Serialize method, which depends on
// the specific type T of "this":
TypeSpecificSerializer.Serialize(xmlWriter, this);
}
}
이 클래스가 제네릭이 아닌 경우 클래스의 각 인스턴스는 동일한를 사용합니다 _typeSpecificSerializer
.
그러나 일반 유형이므로에 대해 동일한 유형의 인스턴스 세트 T
는 단일 _typeSpecificSerializer
유형 (특정 유형에 대해 작성 됨)을 공유하는 반면, 유형 T
이 다른 인스턴스는의 다른 인스턴스를 사용합니다 _typeSpecificSerializer
.
예
다음 두 가지 클래스를 제공합니다 SerializableEntity<T>
.
// Note that T is MyFirstEntity
public class MyFirstEntity : SerializableEntity<MyFirstEntity>
{
public string SomeValue { get; set; }
}
// Note that T is OtherEntity
public class OtherEntity : SerializableEntity<OtherEntity >
{
public int OtherValue { get; set; }
}
... 사용해 봅시다 :
var firstInst = new MyFirstEntity{ SomeValue = "Foo" };
var secondInst = new MyFirstEntity{ SomeValue = "Bar" };
var thirdInst = new OtherEntity { OtherValue = 123 };
var fourthInst = new OtherEntity { OtherValue = 456 };
var xmlData1 = firstInst.Serialize();
var xmlData2 = secondInst.Serialize();
var xmlData3 = thirdInst.Serialize();
var xmlData4 = fourthInst.Serialize();
이 경우, 후드, firstInst
및 secondInst
동일 클래스 (즉, 인스턴스의 것 SerializableEntity<MyFirstEntity>
)과 같은 그들 인스턴스를 공유 할 것이다 _typeSpecificSerializer
.
thirdInst
그리고 fourthInst
다른 클래스 (의 인스턴스이다 SerializableEntity<OtherEntity>
), 그리고 이렇게 인스턴스를 공유 _typeSpecificSerializer
즉 다른 다른 두에서.
즉, 각 엔터티 유형 마다 서로 다른 serializer 인스턴스를 얻는 동시에 각 실제 유형의 컨텍스트 내에서 정적 상태를 유지합니다 (예 : 특정 유형의 인스턴스간에 공유).