Vra

OK, ek weet wat jy dink, "hoekom skryf'n metode wat jy doen nie wil hê mense om te gebruik?" Reg?

Wel, in kort, ek het'n klas wat nodig het om te wees serialized te XML.Ten einde vir die XmlSerializer om dit te doen sy magie, die klas moet'n standaard, leë constructor:

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

So, ek nodig het om dit te hê, maar ek wil nie mense om te gebruik dit, so is daar enige kenmerk wat kan gebruik word om die merk van die metode as "GEBRUIK NIE"?

Ek was te dink van die gebruik van die Uitgediende skryf (want dit kan stop die bou), maar dit lyk net kinda "verkeerd" is, is daar enige ander manier om dit te doen, of doen ek nodig het om voort te gaan en byt die bullet?:)

Update

OK, ek het aanvaar Keith se antwoord, want ek dink in my hart van harte, ek is dit heeltemal eens.Dit is hoekom ek die vraag gevra in die eerste plek, ek hou nie van die idee van die Uitgediende kenmerk.

Maar...

Daar is nog'n probleem, terwyl ons word in kennis gestel in intellisense, ideaal gesproke, ons wil graag om te breek die bou, so is daar enige manier om dit te doen?Miskien is die skep van'n persoonlike kenmerk?

Meer gefokus vraag is geskep hier.

Was dit nuttig?

Oplossing

As 'n klas is [Serialisable] (dit wil sê dit kan kopieer rondom die plek as wat nodig is) die param-minder konstruktor is nodig om deserialise.

Ek vermoed dat jy toegang jou kode te dwing om standaard vir jou eiendom te slaag om 'n parameters constructor.

Eintlik jy sê dat dit OK is vir die XmlSerializer om 'n kopie en dan stel eienskappe maak, maar jy wil nie jou eie kode te.

Om 'n mate ek dink dit is oor-ontwerp.

Just add XML kommentaar wat detail wat eienskappe hoef inisialisering (en wat om te).

Moenie [Obsolete] , want dit is nie. Behou wat vir werklik afgekeur metodes.

Ander wenke

Jy kan gebruik:

[Stelsel.ComponentModel.EditorBrowsable(Stelsel.ComponentModel.EditorBrowsableState.Nooit)]

so dat dit nie opdaag nie in Intellisence.Indien die verbruiker nog steeds wil om dit te gebruik wat hulle kan, maar dit sal nie so kan koppel nie.

Keiths punt oor ingenieurswese staan nog al.

Ek lees die opskrif en dadelik gedink "uitgediende atribute". Hoe gaan dit

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....

Ek sou eintlik geneig om te verskil met almal wat gepleit vir die gebruik van die ObsoleteAttribute as die MSDN dokumentasie sê dat:

  

Die nasien 'n element as verouderde stel die gebruikers wat die element in toekomstige weergawes van die produk sal verwyder word.

Sedert die generiese vervaardigerskampioenskap vir XML serialisasie nie van die aansoek moet verwyder word sal ek nie van toepassing is dit net in geval 'n onderhoud ontwikkelaar in die pad af is nie vertroud is met hoe XML serialisasie werk.

Ek het eintlik al met behulp van Keith se metode van net daarop te let dat die constructor word gebruik vir serialisasie in XML dokumentasie sodat dit wys in IntelliSense.

Jy kan jou eie Attribute bou afgelei klas, sê NonCallableAttribute om metodes te kwalifiseer, en dan voeg by jou liggaamsbou / CI-kode analise taak die tjek te monitor indien enige kode is die gebruik van dié metodes.

In my opinie, jy kan regtig nie ontwikkelaars te dwing om die metode gebruik nie, maar jy kan opspoor wanneer iemand die reël gebreek so gou as moontlik en dit reg te stel.

Sjoe, dit probleem is afluister my ook.

Jy moet ook standaard vervaardigerskampioenskap vir NHibernate, maar ek wil om mense te dwing om NIE te gebruik C # 3,0 voorwerp initializers sodat klasse gaan deur constructor kode.

throw new ISaidDoNotUseException();

Skei jou serialiseerbaar voorwerp van jou domein voorwerp.

Wat jy soek is die ObsoleteAttribute klas:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

ObsoleteAttribute sal waarskynlik werk in jou situasie - jy kan selfs veroorsaak dat die bou om te breek as wat metode gebruik word.

Sedert uitgediende waarskuwings voorkom tydens kompilering, en sedert die besinning wat nodig is vir serialisasie plaasvind tydens looptyd, merk dat metode uitgediende nie sal breek serialisasie, maar sal ontwikkelaars waarsku dat die metode is daar nie om gebruik te word.

Ek gebruik die ObsoleteAttribute .

Maar ook jy kan 'n paar opmerkings natuurlik het.

En uiteindelik heeltemal verwyder as jy kan (nie die verenigbaarheid met iets oud handhaaf). Dit is die beste manier.

Yep daar is.

Ek het hierdie blog post daaroor Werk met die ontwerper .

En hier is die kode:


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top