C# – několik tipů a triků


Několik tipů, rad a ukázek kódu nejen pro začátečníky a mírně pokročilé v programovacím jazyce C# o kterých je dobré vědět.

Klíčové slovo var

Pomocí klíčového slova var není potřeba přímo zadávat typ proměnné, ale nic se nemá přehánět, protože přehnané používání var vede k nepřehlednosti kódu, a tak je vhodné var používat s rozmyslem, např. při procházení kolekcí, ve které mohou být poděděné, či různé třídy, které je potřeba rozlišit apod.

var index = 10; // implicitně
int index = 10; //explicitně 

var userName = "admin";
string userName = "admin";

var user = new UserModel("admin");
UserModel user = new UserModel("admin");

foreach (var column in Columns)
{
  if(column is DataGridTextColumn)
    // todo
  else
    if(column is DataGridTemplateColumn)
      // todo 
}

Auto property

Pomocí zápisu přes auto property, je možné vynechat privátní proměnné pro základní property, tedy pouze pro ty, kde se hodnota vypisuje nebo nastavuje, nic víc. V případě potřeby další funkčnosti v property je nutné použít klasický způsob.

 
private string _userName; 
public string UserName 
{ 
  get { return _userName; } 
  set { _userName = value; } 
} 

public UserName { get; set; } 
public UserName { get; } 
public UserName { get; private set; } 

private string _userName; 
public string UserName 
{
  get { return _userName; } 
  set 
  { 
    _userName = value; 
    OnPropertyChanged("UserName"); 
  } 
} 

Zkrácený zápis if

Podmínku if v C# je možné psát klasickým způsobem nebo zkráceně přes zápis: “(podmínka) ? true : false;” s tím, že je možné tento zápis do se sebe dál zanořovat podle libosti, ale opět platí, že nic se nemá přehánět, nejen kvůli pěkné čitelnosti kódu…


public int Count(ICollection collection) 
{ 
  if(collection == null) 
    return 0; 
  else
    return collection.Count;
} 

public int Count(ICollection collection) 
{ 
  return collection == null ? 0 : collection.Count; 
}

Operátor ??

Operátor ?? (null-coalescing) slouží k definování výchozí hodnoty nulovatelných návratových typů při konkrétním použití, resp. v případě že volaná hodnota bude prázdná (bez použití podmínky if) – pokud je levá strana prázdná, vrátí ji, jinak vrátí tu pravou:

 
public string CurrentUserName 
{ 
  get { return GetCurrentUserName() ?? "Unknown"; } 
} 

Pokud metoda GetCurrentUserName() vrátí hodnotu null, tak bude property CurrentUserName vracet hodnotu “Unknown”, jinak konkrétní hodnotu metody.

Inicializace objektů

Při vytváření nových objektů je možné využít object inicialiazator místo vytvoření objektu a následného postupného plnění properties.

 
User user = new User(); 
user.Name = "admin"; 
user.IsEnabled = "true"; 
... 

User user = new User { Name = "admin", IsEnabled = true, ... } 

Samozřejmě by šlo použít inicializaci properties v konstruktoru objektu (User), ale to je kvůli čitelnosti a přehlednosti vhodné jen do určitého počtu properties. Navíc pro použití inicializeru není potřeba na objektu definovat žádnou další funkčnost (přetížený konstruktor).

Zkrácená inicializace polí a kolekcí

Stejným způsobem se nechají zapisovat i pole a kolekce:


int[] numbers = new int[3]; 
numbers[0] = 1; 
... 

int[] numbers = new int[] { 1, 2, 3 }; 

List<int> numbers = new List<int>(); 
numbers.Add(1); 
... 

List<int> numbers = new List<int> { 1, 2, 3 }; 

Pozn.: při inicializaci pole zkráceným způsobem není potřeba přímo zadávat velikost pole…

Klíčové slovo params

Pomocí klíčového slova params je možné definovat parametr metody, který má variabilní počet argumentů a hlavní výhoda tohoto použití je pak ve volání, kde není potřeba zadávat konkrétní typ (kolekce), ale pouze parametry oddělené čárkou:


public IList<User> FindUsersByIds(params int[] ids) 
{ 
  foreach(int id in ids) 
  {
    // todo 
  } 
} 

IList<User> users = FindUsersByIds(1, 20, 30); 

Výchozí hodnoty parametrů

Díky Optional Arguments je možné se zbavit přetížených metod, ale opět platí, že nic se nemá přehánět, protože v případě použití většího počtu volitelných parametrů a následné nutnosti volat metodu s jinou než výchozí hodnotou je docela problém, resp. všechny předchozí parametry pak musí být zapsány s výchozí hodnotou, viz příklad:


public User CreateUser(string name, 
                       confirmation = true, 
                       bool isEnabled = "true",
                       string comment = null) 
{ 
  ... 
} 

User user = CreateUser("admin"); 
User user = CreateUser("test", true, true, "Testovací účet...");

Regiony

Regiony umožňují oddělovat v rámci třídy části kódu do jakýchsi logických celků, které se pak dají zabalit a rozbalit. Ovšem výhody, či nevýhody jejich používání jsou velmi subjektivní, zaleží buď na každém zvlášť nebo na firemních pravidlech formátování kódu. Nevýhoda je, že po zabalení kódu příkazem CollapseAllOutlining ve VS jsou vidět právě akorát regiony a jejich obsah je pak nutné rozklikávat, kdežto bez použití regionů je k dispozici obsah – proměnné, hlavičky metod apod.


// uživatel 

#region User 

public User CurrentUser { get; set; } 

public User CreateUser() 
{ 
  ... 
} 

#endregion 

// role 

#region Role 

public RoleCurrentRole { get; set; } 

public Role CreateRole() 
{ 
  ... 
} 

#endregion 

Direktiva #if

Díky direktivě #if je možné vykonávat rozdílný kód pro DEBUG i RELEASE mód:

 
#if DEBUG 
  DefaultUserName = "test"; 
#else 
  DefaultUserName = null; #endif 

, , , , , , , , ,

Komentáře jsou uzavřeny.