A formatação de código do C# recebeu diversas influencias do Java (seu competidor direto quando foi criado, hoje não é mais) e também de outras linguagens mantidas pela Microsoft na época como VisualBasic.

Dificilmente alguém vai ter uma resposta precisa de pq as chaves na formatação padrão do Visual Studio começa na linha abaixo da primeira linha do bloco. Talvez isso facilite para a IDE onde começa e termina cada bloco, talvez fosse uma necessidade para o processo de compilação quando ela foi criada e se manteve assim. No fim, isso é apenas uma convenção, nada vai parar de funcionar por conta da formatação do código.


Quanto ao padrão de usar I para interfaces, eu já acho que isso é um padrão ruim. Quando a única coisa que diferencia o nome da classe da sua interface é a letra I, provavelmente você não precisa de uma interface.

Já vi códigos onde havia apenas uma classe para a interface, por exemplo:

    interface IDbConnection
    class DbConnection : IDbConnection

A intenção é boa, mas só adiciona complexidade pois se é 1 pra 1, não precisa de interface.

Agora se sua aplicação pode ter diferentes implementações, aí começa a fazer sentido:

    interface DbConnection
    class MySQLDbConnection : DbConnection
    class SQLiteDbConnection : DbConnection
    class OracleDbConnection : DbConnection

Nesse cenário, faz sentido ter uma interface pois a aplicação espera uma variação de implementações, e a própria nomenclatura das classes indica que não precisa do I na interface.

"Ah, mas vai que um dia eu precise de mais uma implementação de conexão...", quando esse dia chegar você cria a interface e as implementações, enquanto ele não chega, use apenas uma implementação e mantenha as coisas simples.

Mano, o padrão é usar I em todas as interfaces, não apenas em relação 1:1. Até porque a implementação diz respeito mais sobre o teu código do que sobre o padrão da linguagem.

Sempre que tu for implementar uma interface tu sabe já de antemão que é uma interface pelo prefixo I. Isso é particularmente importante quando o padrão extends/implements se aplicam da mesma forma através de um simples ":".

Sobre PascalCase, pensei que fosse uma nomenclatura antiga da Microsoft, por conta das pastas de arquivos do Windows, serem desse jeito. Isso influenciou até numa boa visibilidade, pois no lançamento do Java, por conta dos processos talvez MS gostaria de fazer diferente.

Sobre I na interface, achei uma ótima ideia por questões que voce sabe quando será uma Interface por causa da visibilidade, ao contrario do Java que voce precisa abrir a documentação do método/atributo e verificar se é uma interface, etc.

> Sobre I na interface, achei uma ótima ideia por questões que voce sabe quando será uma Interface por causa da visibilidade, ao contrario do Java que voce precisa abrir a documentação do método/atributo e verificar se é uma interface, etc. Não faz muito sentido né? Se você vai usar uma classe ou interface o mínimo que você precisa saber é o que ela oferece, normalmente lendo a documentação. Começar com **I** ou não, nesse caso não ajuda em nada. Por exemplo, o que mudaria para você saber que `IDbConnection`é uma interface? Se você não conhece-la, não ajudar muito de qualquer forma. Agora imagina uma classe chamada `DbConnection`, não existem variações no seu sistema então `DbConnection` é a única classe que implementa o que você precisa. Se por ventura você precisar de variações, você pode converter a classe para uma interface sem mudar seu nome, e gerar classes derivadas como `MySQLDbConnection` e `PostgreSQLDbConnection` que implementem a interface `DbConnection` e tudo continuará funcionando. Usar o **I** para interface me lembra a [notação húngara](https://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_h%C3%BAngara) que era usada muitos anos atrás, onde variáveis de texto começam como **str**, **txt** ou **s**, por exemplo: - strNomeCliente - txtEndereco - sEmail - intIdade - iDia - dtNascimento - ... e por aí vai Se você precisa do **I** para diferenciar uma interface, então precisaria do **A** para uma classe abstrata (`ADbConnection`) certo? E do **S** para uma struct (`SPessoa`) não é? Percebe que o **I** é só um ruído de um passado onde as IDEs não ofereciam tantas informações e a documentação não era tão acessível?