Использование структур с сервисами WCF

Похоже, что Вы кодируете в C#, которому назвали метод, Равняется тому Вашему классу, должен реализовать, необходимо ли хотеть выдержать сравнение, два объекта с помощью некоторой другой метрики, чем "являются этими двумя указателями (потому что объектные дескрипторы просто что, указатели) к тому же адресу памяти?".

я захватил некоторый пример кода от здесь :

class TwoDPoint : System.Object
{
    public readonly int x, y;

    public TwoDPoint(int x, int y)  //constructor
    {
        this.x = x;
        this.y = y;
    }

    public override bool Equals(System.Object obj)
    {
        // If parameter is null return false.
        if (obj == null)
        {
            return false;
        }

        // If parameter cannot be cast to Point return false.
        TwoDPoint p = obj as TwoDPoint;
        if ((System.Object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (x == p.x) && (y == p.y);
    }

    public bool Equals(TwoDPoint p)
    {
        // If parameter is null return false:
        if ((object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (x == p.x) && (y == p.y);
    }

    public override int GetHashCode()
    {
        return x ^ y;
    }
}

Java имеет очень похожие механизмы. Эти равняется () , метод является частью Объект класс, и Ваш класс перегружает его, если Вы хотите этот тип функциональности.

причиной, перегружающейся '==', может быть плохая идея для объектов, то, что, обычно, Вы все еще хотите быть в состоянии сделать, "они тот же указатель" сравнения. Для них обычно полагаются, например, вставляя элемент в список, где никакие дубликаты не позволяются, и часть Вашего материала платформы не может работать, если этот оператор перегружается нестандартным способом.

14
задан stakx supports GoFundMonica 18 June 2012 в 19:40
поделиться

1 ответ

Если вы можете создать структуру и поместить в нее атрибут [DataContract] - продолжайте и используйте его! Для WCF это не имеет значения - WCF требует только, чтобы класс или структура, которые используются, были помечены атрибутом DataContract, а все поля, которые должны быть включены в сериализованное сообщение, должны быть помечены [DataMember] Атрибут .

Если вы проверите документы MSDN на DataContractAttribute , он показывает, что вы также можете использовать его в структуре:

[AttributeUsageAttribute(AttributeTargets.Class|
 AttributeTargets.Struct|AttributeTargets.Enum, 
 Inherited = false, AllowMultiple = false)]
public sealed class DataContractAttribute : Attribute

ОБНОВЛЕНИЕ: относительно того, когда использовать структуру вместо класса (в общем, в .NET), см. этот вопрос SO здесь:

Когда мне следует использовать структуру вместо класса?

Однако, поскольку WCF действительно касается передачи сообщений (т.е. ваш клиент делает вызов метода, этот вызов и его параметры преобразуются в сериализованное сообщение, которое отправляется по сети, а затем повторно собирается на другом конце и превращается обратно в вызов метода), я не вижу никаких веских причин для использования структура .

Я бы сказал, что все преимущества общего .NET не применимы в SOA-мире WCF (вы не передаете экземпляры классов или структур - см. Выше).

19
ответ дан 1 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: