Como vocês podem ver, é possível incluir CSS em todo tipo de arquivo. Agora imagine-se desenvolvendo ou mantendo um programa que mistura tudo e põe as coisas erradas nos arquivos errados, fica uma bagunça. Então mais uma vez: ponha cada coisa no seu lugar. Essa mania de por tudo num arquivo só é coisa de quem não tem uma IDE decente e fica usando editores de texto simples para programar.
Conteúdo no .html dificulta a internacionalização.
Javascript no .html dificulta a compreensão e depuração do código, mesmo que seja um simples onclick.
HTML no script do servidor ou no .js dificulta a leitura de código e formação correta do markup. Para contornar isso use um view engine. Ex: purepara JavaScript.
CSS ou style no .html ou no .js dificulta a atualização de layout. Lembre-se: o layout ou design de uma página sempre muda.
O Visual Studio nas versões pagas aceita plugins. Os mais úteis na minha opnião são:
PowerCommands - adiciona comandos úteis aos menus de contexto, como por exemplo "Remove and Sort Usings" para a solução ou projeto inteiro.
GhostDoc - Adiciona uma tecla de atalho que documenta automaticamente em inglês o método ou classe que o cursor está focando
Productivity Power Tools - entre outras funcionalidades fornece um "Solution Navigator" alternativo ao "Solution Explorer" que permite, entre outras coisas, encolher todos os projetos da solution com um clique
Collapse Selection In Solution Explorer - adiciona uma opção ao menu de contexto do "Solution Explorer" que permite encolher os projetos. Substitui a funcionalidade que eu mais usava do Productivity Power Tools sem os bugs daquele
Solution Load Manager - Permite definir gatilhos de carregamento para os projetos de uma solution. Assim a solution carrega e roda mais rapidamente.
E para controle de versão
VisualHG - cliente mercurial com ícones, toolbar e entradas no menu de contexto
AnkhSVN - cliente subversion com ícones, toolbar e entradas no menu de contexto
Graças ao Garbage Collector (GC) entre outras funcionalidades, no .NET a desalocação de recursos é simplificada em relação às plataformas não gerenciadas, como o Win32 C/C++, onde princípios como RAII são essenciais para a gerência de recursos.
O GC desaloca todos os recursos para os quais não há mais referência, assim as variáveis locais não necessitam que removamos as referências manualmente. Os objetos de determinado escopo, delimitado pelas chaves ('{' e '}'), são coletáveis assim que o escopo de execução é encerrado, e o GC, que é executado periodicamente, desalocará os recursos na próxima iteração.
{
Object objeto = new Object();
// código
objeto = null; //desnecessário
} //fim do escopo e o objeto é liberado para a coleta
Porém isso não ocorrerá se um objeto com tempo de vida maior guardar uma referência para o mesmo objeto:
private KeyValuePair
Mas alguns objetos utilizam recursos que não são gerenciados pelo GC. Um exemplo de um recurso não gerenciado é a exclusividade de acesso a um arquivo, ou outro tipo de Handle fornecido pela WinAPI. Para estes objetos é necessário executar o método Dispose:
StreamReader arquivo = new StreamReader(@"c:\autoexec.bat");
//código
arquivo.Dispose();
Mas se surgir uma exceção no meio do caminho, o método "Dispose" não será invocado. Portanto é necessário envolver o código num try-finally que garantirá que o recurso será liberado mesmo havendo exceções
A linguagem C# possui um atalho para tal construção que é IL-equivalente à construção acima:
using(StreamReader arquivo = new StreamReader(@"c:\autoexec.bat"))
{
//código
}
Esta função "using" aceita como parâmetro qualquer objeto que implemente a interface IDisposable. Por padrão todos os objetos que herdem esta interface devem ser instanciados em blocos using, direta ou indiretamente.
Quando o escopo do objeto não for terminar imediatamente para algumas classes do .NET é necessário também remover a referência. Costuma-se utilizar tal procedimento com a classe System.Threading.Timer no caso a seguir:
A implementação acima falhará no caso de uma exceção, pois o método timer.Dispose() não será invocado. Para corrigir deveríamos sobrescrever o método Dispose(bool disposing) implementado pela classe ServiceBase:
Algumas outras classes do .NET não possuem uma implementação do método Dispose() da forma esperada, por exemplo as classes que herdam da interface ICommunicationObject. Para elas cria-se um wrapper que corrige este algoritmo:
public sealed class CommunicationObjectWrapper : IDisposable
{
public ICommunicationObject CommunicationObject { get; private set; }
public CommunicationObjectWrapper(ICommunicationObject communicationObject)
{
CommunicationObject = communicationObject;
}
public void Close()
{
if (CommunicationObject != null)
{
CommunicationObject.Close();
}
}
public void Dispose()
{
if (CommunicationObject != null)
{
try
{
((IDisposable)CommunicationObject).Dispose();
}
catch (CommunicationException)
{
CommunicationObject.Abort();
}
catch (TimeoutException)
{
CommunicationObject.Abort();
}
catch (Exception)
{
CommunicationObject.Abort();
throw;
}
}
}
}
Erro HTTP 404.3 - Not Found
A página que você está solicitando não pode ser servida devido à configuração da extensão. Se a página for um script, adicione um manipulador. Se for necessário baixar o arquivo, adicione um mapa MIME.
Basta executar como administrador
"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i