Diferença entre override e new no C#

Vamos falar sobre os modificadores override e new. Quando utilizamos o override é possivel utilizarmos a tecnica de polimorfismo, como não declarar um objeto do tipo concreto apenas utilizar a abstração. Porém no caso do modificador new ele é apenas utilizado quando a variavel é especifica do tipo concreto. Para exemplificar será criado duas classes uma abstrata e uma concreta como a seguir:

 public abstract class MyBaseObject
    {
        public  abstract void MethodForOverride2();

        public virtual void MethodForOverride()
        {
            Console.WriteLine("MethodForOverride of MyBaseObject");
        }

        public void MethodForNew()
        {
            Console.WriteLine("MethodForNew of MyBaseObject");
        }


    }

    public class MyFirstConcreteObject : MyBaseObject
    {
        public override void MethodForOverride2()
        {
            Console.WriteLine("MethodForOverride2 of MyFirstConcreteObject");
        }

        public override void MethodForOverride()
        {
            Console.WriteLine("MethodForOverride of MyFirstConcreteObject");
        }
        public new void MethodForNew()
        {
            Console.WriteLine("MethodForNew of MyFirstConcreteObject");
        }
    }

Após isso faça a chamada assim em uma console application para executar os metodos:

            MyBaseObject myBaseObject = new MyFirstConcreteObject();
            MyFirstConcreteObject myConcreteObject = new MyFirstConcreteObject();

            Console.WriteLine("myBaseObject");
            myBaseObject.MethodForNew();
            myBaseObject.MethodForOverride();
            myBaseObject.MethodForOverride2();

            Console.WriteLine("");
            Console.WriteLine("myConcreteObject");
            myConcreteObject.MethodForNew();
            myConcreteObject.MethodForOverride();
            myConcreteObject.MethodForOverride2();

Executar esse codigo deve ter um retorno como na imagem. É possivel perceber que o metodo utilizando override sempre é utilizado da classe concreta, porém quando utilizado o modificador new depende do tipo de variavel que está sendo declarada.

Execucao

Todo o código deste post está no github neste link.

Anúncios

Não encontro o Metodo PostAsJsonAsync do HttpClient

Esse metodo é uma extensão da classe HttpClient, existem diversos tutoriais que utilizam esse metodo mais não disponibilizam de onde buscar, esse metodo está na Dll System.Net.Http.Formatting que pode ser encontrada nos assemblies do framework.

Referencia

Criar eventos ao adicionar item em List C#

Isso é algo realmente chato as vezes, você precisa fazer uma ação antes de que qualquer item seja inserido em determinada lista. Isso as vezes se torna bem chato se o sistema não tem um encapsulamento das propriedades bem organizado.

Tem um projeto no Github(HAL – Help a lot) exatamente com uma coleção que faz isso, eu iniciei esse projeto agrupar funções corriqueiras, que as vezes é necessário criar em diversos sistemas, ou cada empresa tem sua DLL mágica que tem as funções básicas. O código está totalmente aberto quem quiser olhar o código, tem alguma sugestão ou quer ajudar no desenvolvimento só entrar em contato comigo e pode começar a desenvolver.  Caso queria fazer o download Apenas  DLL.

Bom vamos ao problema, precisamos de uma lista que precisa interceptar a ação dos métodos Add, Insert, Remove e RemoveAt de uma lista para poder colocar o evento antes ou depois dessas ações. O que vou fazer é criar uma classe genérica que implementa IList<T> e aplicar o padrão de projetos Proxy para interceptar as ações necessárias. O código ficara assim:

    public class HalList<T> : IList<T>
    {
        public delegate void AddItemDelegate(T item);
        public delegate void RemoveItemDelegate(T item);

        public delegate void InsertItemDelegate(int index, T item);
        public delegate void RemoveAtItemDelegate(int index, T item);

        public event InsertItemDelegate BeforeInsertItem;
        public event InsertItemDelegate AfterInsertItem;

        public event RemoveAtItemDelegate BeforeRemoveAtItem;
        public event RemoveAtItemDelegate AfterRemoveAtItem;

        public event AddItemDelegate BeforeAddItem;
        public event AddItemDelegate AfterAddItem;

        public event RemoveItemDelegate BeforeRemoveItem;
        public event RemoveItemDelegate AfterRemoveItem;

        private IList<T> _list;

        public HalList()
        {
            _list = new List<T>();
        }

        public IEnumerator<T> GetEnumerator()
        {
            return _list.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public void Add(T item)
        {
            if (BeforeAddItem != null)
                BeforeAddItem(item);

            _list.Add(item);

            if (AfterAddItem != null)
                AfterAddItem(item);
        }

        public void Clear()
        {
            _list.Clear();
        }

        public bool Contains(T item)
        {
            return _list.Contains(item);
        }

        public void CopyTo(T[] array, int arrayIndex)
        {
            _list.CopyTo(array, arrayIndex);
        }

        public bool Remove(T item)
        {
            if (BeforeRemoveItem != null)
                BeforeRemoveItem(item);

            bool ret = _list.Remove(item);

            if (AfterRemoveItem != null)
                AfterRemoveItem(item);
            return ret;
        }

        public int Count
        {
            get { return _list.Count(); }
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        public int IndexOf(T item)
        {
            return _list.IndexOf(item);
        }

        public void Insert(int index, T item)
        {
            if (BeforeInsertItem != null)
                BeforeInsertItem(index, item);

            _list.Insert(index, item);

            if (AfterInsertItem != null)
                AfterInsertItem(index, item);
        }

        public void RemoveAt(int index)
        {

            if (_list.Count <= index)
                throw new HalException("Index out of range on the List!");

            T item = _list[index];

            if (BeforeRemoveAtItem != null)
                BeforeRemoveAtItem(index, item);

            _list.RemoveAt(index);

            if (AfterRemoveAtItem != null)
                AfterRemoveAtItem(index, item);
        }

        public T this[int index]
        {
            get { return _list[index]; }
            set { _list[index] = value; }
        }
    }

Pode ser questionado o motivo de deixar tudo separa, mas estou ainda pensando se vou implementar alguma coisa diferente para cada um ou colocar em todos, esse ainda é o código inicial no projeto e pode ser alterado, mas esse código já está testado.

Como descobrir o tamanho de um arquivo

Para descobrir o tamanho  de um arquivo com C# basta utilizar a classe FileInfo, e utilizar a propriedade Length que retorno o tamanho em bytes do arquivo, ai basta dividir por 1024 quantas vezes precisar para ter o tamanho na proporção que precisa, esse e um exemplo do calculo ate GB:

FileInfo fi =new FileInfo("nomeArquivo.doc");
 var TamanhoEmKb = (fi.Length/1024F);
 var TamanhoEmMb = ((fi.Length/1024F)/1024F);
 var TamanhoEmGb = (((fi.Length/1024F)/1024F)/1024F);

Como Salvar um classe em XML

Se você necessita criar um xml a partir de uma classe, e depois é necessário que ao carregar esse arquivo você conseguir recriar a classe, isso é bem simples apenas é necessário seguir esses passos.

Primeiro você precisa definir a classe que você quer que crie o XML como Serializable colocando o atributo em cima( [Serializable] ), após isso é necessário criar um construtor sem parâmetros, ele pode ser protected apenas não pode ser private, segue um exemplo de uma classe criada para gerar um XML:

[Serializable] // atributo que define que a classe é serializavel
 public class Pessoa
 {
 private string _nome;
 private string _nomeMae;
 private int _idade;

//Obrigatório ter esse construtor.
 protected Pessoa()
 {

 }

public Pessoa(string nome, string nomeMae, int idade)
 {
 _nome = nome;
 _nomeMae = nomeMae;
 _idade = idade;
 }

public string Nome
 {
 get { return _nome; }
 set { _nome = value; }
 }

public string NomeMae
 {
 get { return _nomeMae; }
 set { _nomeMae = value; }
 }

public int Idade
 {
 get { return _idade; }
 set { _idade = value; }
 }

public override string ToString()
 {
 return string.Format("Nome: {0} Minha mãe é:{1} e eu tenho {2}anos", Nome, NomeMae, Idade);
 }
 }

Após isso vamos a um exemplo de como salvar essa classe em um arquivo Físico em xml e depois carregado(Você também pode gerar apenas o Texto em xml utilizando a mesma estrutura, mas ao invés de Stream utilize TextWriter):

static void Main(string[] args)
 {

using (Stream fileStream = new FileStream(@"C:\pessoa.xml", FileMode.OpenOrCreate))
 {
 Pessoa pessoalParaCriarArquivo = new Pessoa("Meu Nome", "Nome da Minha Mae", 20);
 XmlSerializer xmlSerializer = new XmlSerializer(pessoalParaCriarArquivo.GetType());
 xmlSerializer.Serialize(fileStream, pessoalParaCriarArquivo);
 Console.Write("Pessoa Para Salvar Arquivo:" + Environment.NewLine + pessoalParaCriarArquivo.ToString() + Environment.NewLine);
 }

 using (XmlReader xmlReader = XmlReader.Create(@"C:\pessoa.xml"))
 {
 XmlSerializer xmlSerializer = new XmlSerializer(typeof(Pessoa));
 Pessoa pessoaLidaDoArquivo = (Pessoa) xmlSerializer.Deserialize(xmlReader);
 Console.Write("Pessoa lida do Arquivo:" + Environment.NewLine + pessoaLidaDoArquivo.ToString());
 }

Console.ReadKey();

}

Esse código irá gerar um arquivo xml no c:\ da sua máquina com a estrutura da classe, e após irá ler esse mesmo arquivo e criar um objeto igual ao que foi gerado o arquivo, essa transformação para xml é muito útil para transferência de informações entre Webservices ou até mesmo de uma aplicação para outra.

O arquivo seguindo esse exemplo passado irá ficar assim:

<?xml version="1.0"?>
<Pessoa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Nome>Meu Nome</Nome>
<NomeMae>Nome da Minha Mae</NomeMae>
<Idade>20</Idade>
</Pessoa>

Como remover acentos de uma string

Sabe quando você precisa encontrar aquele método e não acha e acaba perdendo tempo procurando então, esses dias eu procurei por métodos para remover os acentos de uma string e tive que passar por pelo menos 10 sites pois tinham vários métodos que não funcionavam, segue um método para remover acentos que realmente funciona:

public static string RetiraAcentos(string strcomAcentos)
 {
     string strsemAcentos = strcomAcentos;
     strsemAcentos = Regex.Replace(strsemAcentos, "[áàâãª]", "a");
     strsemAcentos = Regex.Replace(strsemAcentos, "[ÁÀÂÃ]", "A");
     strsemAcentos = Regex.Replace(strsemAcentos, "[éèêë]", "e");
     strsemAcentos = Regex.Replace(strsemAcentos, "[ÉÈÊË]", "E");
     strsemAcentos = Regex.Replace(strsemAcentos, "[íìî]", "i");
     strsemAcentos = Regex.Replace(strsemAcentos, "[ÍÌÎ]", "I");
     strsemAcentos = Regex.Replace(strsemAcentos, "[óòôõº]", "o");
     strsemAcentos = Regex.Replace(strsemAcentos, "[ÓÒÔÕ]", "O");
     strsemAcentos = Regex.Replace(strsemAcentos, "[úùû]", "u");
     strsemAcentos = Regex.Replace(strsemAcentos, "[ÚÙÛÜ]", "U");
     strsemAcentos = Regex.Replace(strsemAcentos, "[ç]", "c");
strsemAcentos = Regex.Replace(strsemAcentos, "[Ç]", "C");
return strsemAcentos;
 }

Como arredondar números ou limitar dígitos depois da virgula com C#

Se voce precisa arredondar numeros para cima ou para baixo voce precisa utilizar os seguintes metodos:

  • Para que o numero seja arredondado para cima deve ser utilizado o metodo Math.Ceiling Exemplo: 51.666 será transformado em 52.00
  •  Para que o numero seja arredondado para baixo deve ser utilizado o metodo Math.Floor Exemplo: 51.666 será transformado em 51.00
Agora para limitar a quantidade de digitos de um numero é necessário utilizar o metodo Math.Round para fazer isso, como ele funciona:
Você passa o numero e a quantidade de dígitos que você quer que seja utilizado e ele faz um arredondamento automático e retorna o numero com apenas a quantidade de digitos que voce precisa depois da virgula.Exemplo:
  •  Math.Round(10.1120, 2) -> 10.11
  • Math.Round(10.1170, 2) -> 10.12
  • Math.Round(10.1172, 3) -> 10.117
  • Math.Round(10.1178, 3) -> 10.118