2010-10-01 2 views
5

Se in F # Ho metodi come:Come trasferiscono i tipi F # a C#?

drawBox 
drawSphere 
paintImage 

Sarebbero trasferiti a C#, esattamente la stessa cosa?

Se questo è il caso, non comprometterebbe le convenzioni di denominazione in C#, dove i metodi dovrebbero essere PascalCase?

Oppure devo impostare PascalCase in F # per rimediare a questo?

risposta

8

È necessario seguire lo F# Component Design Guidelines.

Le parti degne di nota sono:

  • fare utilizzare la denominazione NET e le convenzioni di capitalizzazione per il codice object-oriented, comprese le librerie F # -facing.
  • Utilizzare PascalCase o camelCase per funzioni pubbliche e valori nei moduli F #. camelCase viene generalmente utilizzato per funzioni pubbliche che sono progettate per essere utilizzate non qualificate (ad esempio invalidArg) e per le "funzioni di raccolta standard" (ad esempio List.map). In entrambi questi casi, i nomi delle funzioni si comportano molto come le parole chiave nella lingua.

Un altro modo di affettarlo:

  • membri e tipi dovrebbe sempre essere PascalCase, proprio come C#
  • entità lasciare legato a moduli possono essere camelCase, ma questa roba è tipicamente non roba che esporrete pubblicamente da una libreria che è destinata a essere consumata da C#
+0

Grazie, per curiosità, sai anche come vengono mostrate le funzioni libere in F # in C#? Perché C# non può avere funzioni libere come F #. –

+0

I moduli in F # appaiono come classi statiche in C#. Nota che il codice 'top-level' in F # è in un modulo; per esempio. il codice di primo livello in 'Program.fs' è compilato in un modulo chiamato' Program' e quindi C# vedrebbe 'Program.blah'. Ma evita i moduli pubblici di F # se vuoi interoparti con C# (come da raccomandazioni nel doc). In altre parole, leggi il documento; abbiamo passato molto tempo a mettere insieme tutte queste informazioni per rispondere a questo tipo di domande. – Brian

+0

Grazie Brian, non sapevo che fossi uno degli sviluppatori di F #. Btw è anche accettabile usare l'attributo CompiledName come ha detto Tomas nella sua risposta? Sembra il meglio di entrambi i mondi. –

1

i nomi dei metodi di tipo saranno gli stessi sia in F # che in C#. se vuoi PascalCase in C#, dovresti usare questa convenzione di denominazione in F #, lo stesso con camelCase.

+0

Ok, grazie. Poiché uso C# in più, probabilmente lo farò. Stavo solo pensando in tal caso, rovinerebbe le convenzioni di denominazione di F #. –

-1

Convenzioni di denominazione sono per gli umani. Compilatori e runtime non si preoccupano davvero se ogni nome di variabile è completamente illeggibile, continueranno a funzionare.

+0

Perché il voto negativo? Il mio punto era quello di indicare che le convenzioni di denominazione sono per noi e quando gli ambienti misti hanno conventiosn differenti possiamo fare ciò che funziona per noi, dal momento che i compilatori/run-time faranno comunque la cosa giusta. – cdkMoose

5

Come già sottolineato da altri, i nomi dei membri compilati sono esattamente gli stessi dei nomi scritti nel codice F #. In generale, è una buona idea seguire le convenzioni di denominazione C# standard quando si dichiarano le classi. Quando si dichiara un modulo F #, è possibile utilizzare camelCase (in particolare per i moduli destinati agli utenti F #) o PascalCase se si desidera utilizzarli da C#.

Inoltre, è possibile utilizzare un trucco (utilizzato nella libreria di base F # per funzioni come List.map effettivamente compilate come List.Map). È possibile utilizzare l'attributo CompiledName per specificare il nome nella versione compilata:

module Bar = 
    [<CompiledName("Foo")>] 
    let foo a = a + 1 

Probabilmente è meglio usare una convenzione di denominazione unitaria, ma se si vuole mantenere un bel nome breve per F # utenti e standard di .NET nome per gli utenti C#, questa è un'opzione interessante.

+0

Wow, quell'opzione regola. Grazie per averlo indicato. –

+0

Personalmente, non mi piace davvero "CompiledName"; crea tanti problemi quanti ne risolve. Il meglio che posso dire è che è un male necessario per cose come FSharp.Core.dll (se mai dovessimo spostare il runtime F # nel .NET Framework corretto, i nomi compilati devono essere in allineamento con .NET, che è ciò che motivato 'CompiledName' in primo luogo). – Brian

+0

Come sottolineato da Brian in precedenza, considerarlo solo come un'opzione di ultima istanza. –