Equivalenza dei contratti dati

Perché un client possa inviare correttamente dati di un certo tipo a un servizio o perché un servizio possa inviare correttamente dati a un client, non è necessario che il tipo inviato sia presente nell'estremità ricevente. L'unico requisito è che i contratti dati di entrambi i tipi siano equivalenti. In alcuni casi non è necessaria la stretta equivalenza, come descritto in Controllo delle versioni dei contratti dati.)

Perché i contratti dati siano equivalenti devono avere lo stesso spazio dei nomi e lo stesso nome. Ogni membro dati su uno lato deve inoltre avere un membro dati equivalente sull'altro lato.

Perché i membri dati siano equivalenti devono avere lo stesso nome. Devono inoltre rappresentare lo stesso tipo di dati, che significa che i rispettivi contratti dati devono essere equivalenti.

Nota

Sia per i nomi e gli spazi dei nomi dei contratti dati sia per i nomi dei membri dati viene fatta distinzione tra maiuscole e minuscole.

Per ulteriori informazioni sui nomi e gli spazi dei nomi dei contratti dati, nonché sui nomi dei membri dati, vedere Nomi di contratto dati.

Se sullo stesso lato (mittente o ricevitore) sono presenti due tipi e i contratti dati non sono equivalenti (ad esempio, hanno membri dati diversi), è necessario assegnare loro un nome e uno spazio dei nomi differenti. In caso contrario, è possibile che vengano generate eccezioni.

I contratti dati per i tipi seguenti sono equivalenti:

Ordine dei membri dati ed equivalenza dei contratti dati

L'utilizzo della proprietà Order della classe DataMemberAttribute può influire sull'equivalenza dei contratti dati. Per essere equivalenti, i contratti dati devono avere membri disposti nello stesso ordine. L'ordine predefinito è quello alfabetico. Per ulteriori informazioni, vedere Ordine dei membri dati.

Il codice seguente, ad esempio, comporta contratti dati equivalenti.

Il codice seguente non comporta invece contratti dati equivalenti.

Ereditarietà, interfacce ed equivalenza dei contratti dati

Quando viene determinata l'equivalenza, un contratto dati che eredita da un altro contratto dati viene trattato come se fosse un contratto dati che include tutti i membri dati del tipo di base. Tenere presente che l'ordine dei membri dati deve corrispondere e che i membri del tipo di base precedono nell'ordine i membri del tipo derivato. Inoltre, se due membri dati hanno lo stesso valore di ordine, come nell'esempio di codice seguente, l'ordinamento di questi membri dati è alfabetico. Per ulteriori informazioni, vedere Ordine dei membri dati.

Nell'esempio seguente il contratto dati per il tipo Employee è equivalente al contratto dati per il tipo Worker.

Quando vengono passati parametri e restituiti valori tra un client e un servizio, non è possibile inviare un contratto dati relativo a una classe di base se l'endpoint ricevente prevede un contratto dati relativo a una classe derivata. Questo comportamento è conforme ai principi di base della programmazione orientata a oggetti. Nell'esempio precedente non è possibile inviare un oggetto di tipo Person se è previsto un oggetto di tipo Employee .

Un contratto dati relativo a una classe derivata può essere inviato quando è previsto un contratto dati relativo a una classe di base soltanto se l'endpoint ricevente "riconosce" il tipo derivato utilizzando la classe KnownTypeAttribute. Per ulteriori informazioni, vedere Tipi conosciuti di contratto dati. Nell'esempio precedente un oggetto di tipo Employee può essere inviato se è previsto un oggetto di tipo Person, ma solo se il codice del ricevitore utilizza la classe KnownTypeAttribute per includerlo nell'elenco dei tipi noti.

Quando vengono passati parametri e restituiti valori tra applicazioni, se il tipo previsto è un'interfaccia è come se fosse di tipo Object. Poiché ogni tipo deriva in fondo da Object, ogni contratto dati deriva in ultima istanza dal contratto dati relativo a Object. Quando è prevista un'interfaccia è pertanto possibile passare qualsiasi tipo di contratto dati. Per utilizzare correttamente le interfacce sono necessari ulteriori passaggi. Per ulteriori informazioni, vedere Tipi conosciuti di contratto dati.

Vedere anche

Riferimenti

DataContractAttribute
DataMemberAttribute

Concetti

Ordine dei membri dati
Tipi conosciuti di contratto dati
Nomi di contratto dati