Малко tabs vs spaces тема.
Кое предпочитате да ползвате, var
или да пишете типът винаги. Естествено, ако го правите за LINQ резултат сте мазохисти.
Но, кое предпочитате?
var products = new List<Product>();
или
List<Product> = new List<Product>();
Аз лично смятам, че ако не ползвате var сте мазохисти. Като рефакторирате е много по- лесно да е var
. Пък и е по- естестическо.
Дори
var temp = default(string);
е по- красиво.
A правите ли
public class Hui
{
public IList<NaebaniShutki> NaebaniShutki { get; }
public Hui()
{
NaebaniShutki = new List<NaebaniShutki>();
}
}
Що го правя? Искам някой след мен да не ми преписва цял лист на пропъртито, ами да добавя и маха NaebaniShutki
от него.
var ползвам в LINQ, иначе не виждам особен смисъл да развалям четливостта. Тя вар-та и кирпича са compile-time, накрая все същото излиза. варта те прави по-лежерен
foreach (var pair in someCollection)
вместо
foreach (KeyValuePair<string, int> pair in someCollection)
Абе, ако имаш в някакъв обект анонимен метод с var и го асайнеш към ивент, нямаше ли някаква драма после при dispose-ването да се махне от InvocationList на ивент делегата...
Не виждам как го спираш да махне всички и да си сложи неговите, което е преписване на цял лист.
Откакто цъкам ръст и го, смятам че тези експедиция и типове са ненужни. Имат смисъл само ако пишеш на текстов редактор, а това е ето, което никой не трябва да прави
Е са за linq резутат. Голям прас
var nasraniDupenca = dupenca.Where(x => x.Naakano);
ко му е лошото. Може си видиш типа по всяко време.
Колко курви и кокаин намаза откакто цъкаш на Ръст ?
За къф член ти е IList, това в някакъв много специален случай ще ти трябва вместо IEnumerable.
На Entity (EF), ако е IEnumerable няма Lazy Loading, там ги слагам ICollection. IEnumerable няма Add. IList пък е Sortable. Зависи къде и за какво го ползвам. Например, за Contract ползвам IEnumerable, за Entity ползвам ICollection и ако някъде ми трябва повече операции, IList, може и IDictionary. Гледам да е интерфейса, защото we should depend on abstraction, not concretion.
var когато типът е ясен (тоест когато имаш конструктор или литерал от дясната страна), explicit type в останалите случаи. Първо съм виждал около 5 пъти професионални (вярно junior) програмисти да не разбират, че правят нещо с IEnumerable вместо с IQueryable заради var и да разказват играта на положението. Второ не могат да се видят такива и други подобни грешки когато се чете кода (било то code review или друго) защото за да видиш типа трябва да посочиш тоя var, а ти ако предположиш някакъв тип просто няма да разбереш, че си предположил грешно. От друга страна са хора като мен които са параноици и винаги мислят че са предположили грешно и ръкомахат върху всеки var тоест убивате ми продуктивността като ползвате var. И накрая код се чете не само в IDE. Понякога този код се показва в лекция, понякога се share-ва екран, понякога се чете в GitHub или VSTS. Тогава как разбираме какво е зад var-а? Преди 2-3 месеца Кенов правеше някаква лекция и аз прекарах 5 мин да споря с него през чата защото един var бях предлопожил, че е Task а той бил Task[] или нещо такова. Какво трябваше да направя да посоча var-а в YouTube и да ми покаже типа?
@Stilgar, аз затова им дърпам кода като правя ревю, щото не винаги е ясно какво става само с четене, освен ако не си концентриран на 200% и не знаеш цялото API. Мисля, че код ревюто не е нещо, което трябва да се прави бързо.
Иначе верно, затруднява в тези случаи. Май езикът не се развива така, че всичко да е ясно от пръв поглед. Например новите switch-ове.
Така е разбираемо:
public string WhatFruit => Fruit switch
{
Apple _ => "This is an apple",
_ => "This is not an apple"
};
Но като почнат да nest-ват switch + when? То би трябвало да се раздроби, но го виждам в PluralSight вече на няколко и в първия момент си викам WTF.
Аз съм онзи, лудият, който вместо anonymous метод, ще направи:
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host
.CreateDefaultBuilder(args)
.ConfigureServices(CreateServices)
.ConfigureLogging(CreateLogging)
.ConfigureWebHostDefaults(CreateWebHost)
.UseWindowsService();
}
private static void CreateWebHost(IWebHostBuilder builder)
{
builder
.UseKestrel()
.ConfigureAppConfiguration(CreateConfiguration)
.UseStartup<Startup>();
}
Аз пък им връщам кода да си го оправят ако видя var който не разбирам какво прави. Има една простотия във VS че ToList() го води obvious type което е пълна глупост и само заради него не съм настроил editorconfig да дава warning за варосване.
Ти сигурен ли си че знаеш какво е анонимен метод?
От гледна точка що ползваме strong types езици да. Как ли се оправят джабаскриптите... а те и там измислиха TypeScript. Помня как съм търсел цял ден ;
в AngularJS, щото нямам някакво свястно IDE, ами VSCode.
@Stilgar
TestDelegate testDelC = (x) => { Console.WriteLine(x); };
ПС, ОК, Lambda expression е.
Тогава delegate(string s) { Console.WriteLine(s); };
Но пиша
var consumer = new EventingBasicConsumer(...);
consumer.Received += OnReceived;
private void OnReceived(object sender, BasicDeliverEventArgs e)
{
...
}
Даже бих написал (не е anonymous method, баси, засегна ме)
if(IsItTrue(instance))
{
....
}
с метод
private bool IsItTrue(Instance instance)
{
return instance.field1 // == true
&& instance.field2.Equals("alabala", ignorecase);
}
И какво общо има анонимният метод с оня код от по-предишния ти пост?
Ми няма, идеята ми беше, че пиша експлицитно метод, за да е по- четим кода, което е в противоречие с предпочитанията ми за var
.
Друго нещо, което избягвам е да имам код след 80-та колона. Гледал съм този връх в LGTB общоността и съм взел от него каквото е харесало на субективното ми мнение.
Например, вместо:
public MyFerma(IKrushoberach krushoberach, INegarSPraska4ka negarSPraska4ka, IOsemenitel osemenitel)
{
....
}
ще напиша
public MyFerma(
IKrushoberach krushoberach,
INegarSPraska4ka negarSPraska4ka,
IOsemenitel osemenitel)
{
....
}
LGTB пикът = ITT 2016 - Kevlin Henney - Seven Ineffective Coding Habits of Many Programmers