Did you know?
- 
					
					
					
					
 Habt ihr gewusst, dass ein Indexer params benutzen kann? public class Foobar { public Foobar() { this.FooDic = new Dictionary<string, int>(); } public Dictionary<string, int> FooDic { get; set; } public IEnumerable<int> this[params string[] keys] { get { return keys.Select(k => this.FooDic[k]); } } } class Program { static void Main(string[] args) { Foobar fb = new Foobar(); fb.FooDic.Add("1", 1); fb.FooDic.Add("2", 2); foreach (int number in fb["1", "2"]) { Console.WriteLine(number); } } }
 
- 
					
					
					
					
 Neee, nicht gewusst. 
 Hier mit setter:class wtf<T,U> : IEnumerable<KeyValuePair<T,U>> { private Dictionary<T, U> dic = new Dictionary<T, U>(); public U[] this[params T[] param] { get { return param.Select(key => dic[key]).ToArray(); } set { for (int i = 0; i < value.Length; ++i) { if (dic.ContainsKey(param[i])) dic[param[i]] = value[i]; else dic.Add(param[i], value[i]); } } } public IEnumerator<KeyValuePair<T, U>> GetEnumerator() { return dic.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return dic.GetEnumerator(); } } class Program { static void Main(string[] args) { wtf<string, int> v = new wtf<string, int>(); v["hallo", "welt"] = new[] { 23, 42 }; v["a"] = new[] { 4711 }; v["eins", "zwei", "drei"] = new[] { 1, 2, 3 }; v["zwei"] = new[] { 22222 }; foreach (var i in v) Console.WriteLine(i.ToString()); Console.WriteLine("----"); foreach (var i in v["hallo", "drei"]) Console.WriteLine(i); Console.ReadKey(true); } }Wie könnte man das hässliche new[]{...} loswerden? 
 
- 
					
					
					
					
 Mit einem "Hack". Ist aber fraglich ob man sowas will und ob es schöner ist. //... public U[] this[params U[] param] { get { return param; } } //... v["hallo", "welt"] = v[23, 42];
 
- 
					
					
					
					
 Gewusst. Kennst du dies? Dürfte dir dann vielleicht auch ein Licht aufgehen, wieso paramserlaubt ist class Test { public int this[int x] { get { return 0; } } public int get_Item(int x) { return 0; } } public class Program { public static void Main(string[] args) { var t = new Test(); var r = t[0]; } }------ Build started: Project: TestProject, Configuration: Debug x86 ------ C:\...\Program.cs(5,5): error CS0082: Type 'Test' already reserves a member called 'get_Item' with the same parameter types C:\...\Program.cs(8,14): (Related location) Compile complete -- 1 errors, 0 warningsGrüssli 
 
- 
					
					
					
					
 Wir können ja hier mal ein paar Sprachfeatures sammeln, die man in der freien Wildbahn selten oder nie antrifft. Wusstet ihr, dass man mit | und & die Short-circuit evaluation aushebeln kann? class Program { static bool f1() { Console.Write("f1 "); return true; } static bool f2() { Console.Write("f2 "); return false; } static void Main(string[] args) { if (f1() || f2()) { } //Ausgabe: f1 Console.WriteLine(); if (f1() | f2()) { } //Ausgabe: f1 f2 Console.WriteLine(); if (f2() && f1()) { } //Ausgabe: f2 Console.WriteLine(); if (f2() & f1()) { } //Ausgage: f2 f1 Console.WriteLine(); Console.ReadKey(true); } }
 
- 
					
					
					
					
 µ schrieb: Wusstet ihr, dass man mit | und & die Short-circuit evaluation aushebeln kann? Der Begriff sagt mir jetzt gar nichts, hast du ne Definition dafuer? 
 
- 
					
					
					
					
 
 
- 
					
					
					
					
 µ schrieb: Short-circuit evaluation aushebeln Das zählt nicht als Aushebeln. Es ist der Normalfall. Die "Short-circuit"-operatoren sind vielmehr eine Besser-als-normal-Variante, an die wir uns allerdings längst gewöhnt haben. 
 
- 
					
					
					
					
 Enums können Extensionmethods haben. enum AnEnum { Element1, Element2 } static class Extension { public static string EnumExtension(this AnEnum e) { return "Enum Extension"; } } class Program { static void Main(string[] args) { Console.WriteLine(AnEnum.Element1.EnumExtension()); } }
 
- 
					
					
					
					
 Nützlich, aber sieht man eher selten: var irgendwas = GetResult() ?? String.Empty;
 
- 
					
					
					
					
 loks schrieb: Nützlich, aber sieht man eher selten: var irgendwas = GetResult() ?? String.Empty;Liegt wahrscheinlich daran, das es für die wenigsten lesbar ist. Ich bevorzuge da eher die langform. Entweder wie unten aufgeführt oder die ganz lange.  var sResult = GetResult(); var irgendwas = !String.IsNullOrEmpty(sResult) ? sResult : string.Empty;
 
- 
					
					
					
					
 inflames2k schrieb: loks schrieb: var irgendwas = GetResult() ?? String.Empty;Liegt wahrscheinlich daran, das es für die wenigsten lesbar ist. Du meinst, dass die wenigsten wissen, wie ihre Sprache funktioniert? Weil: Lesbar ist das auf jeden Fall, sehr gut sogar. 
 
- 
					
					
					
					
 inflames2k schrieb: loks schrieb: Nützlich, aber sieht man eher selten: var irgendwas = GetResult() ?? String.Empty;Liegt wahrscheinlich daran, das es für die wenigsten lesbar ist. Ich bevorzuge da eher die langform. Entweder wie unten aufgeführt oder die ganz lange.  var sResult = GetResult(); var irgendwas = !String.IsNullOrEmpty(sResult) ? sResult : string.Empty;Das Beispiel an sich ist natürlich Sinnfrei, aber im Bezug auf Lesbarkeit gewinnt das doch um Längen gegen den Mehrzeiler. class A { public String Name { get; set; } public String Strasse{ get; set; } } void test() { A a = new A() { Name = GetName() ?? String.Empty, Strasse = GetStrasse() ?? String.Empty }; }
 
- 
					
					
					
					
 using kann gestapelt werden. using(StreamReader sr = new StreamReader(".txt")) using(StreamWriter sw = new StreamWriter(".txt")) { sr.ReadLine(); sw.WriteLine(); }
 
- 
					
					
					
					
 Nicht gestapelt, sondern verschachtelt (wie andere Anweisungen z.B. for, if, while etc. auch). Dein Beispiel entspricht also voll ausgeschrieben: using(StreamReader sr = new StreamReader(".txt")) { using(StreamWriter sw = new StreamWriter(".txt")) { var line = sr.ReadLine(); sw.WriteLine(line); } }Und wie man sieht wäre dann folgendes besser using(StreamReader sr = new StreamReader(".txt")) { var line = sr.ReadLine(); using(StreamWriter sw = new StreamWriter(".txt")) { sw.WriteLine(line); } }(oder noch gekürzt ohne die inneren geschweiften Klammern) 
 
- 
					
					
					
					
 Mit stapeln meinte ich auch eher, dass man es genau übereinander schreiben kann, was hilfreich sein kann, wenn man 3-4 using-Blöcke brauch und nicht möchte, dass der Code unnötig weit nach rechts rückt. 
 Aber deine Erklärung ist natürlich richtig.
 
- 
					
					
					
					
 freaky schrieb: ... was hilfreich sein kann, wenn man 3-4 using-Blöcke brauch ... 3-4, herzig  using (var seedReader = new StreamFileReader(m_seedStreams[level], false)) using (var seedSignatureReader = new StreamFileReader(m_seedStreams[level + 1], false)) using (var sourceReader = CreateSourceReader(level)) using (var countingSourceReader = new CountingFileReader(sourceReader, false)) using (var sourceSignatureReader = new StreamFileReader(sourceSignatureStream, false)) using (var targetSink = new StreamByteSink(targetStream, false)) using (var reconstructingNeedSink = new ReconstructingNeedSink()) using (var skippingNeedSink = new SkippingNeedSink()) using (var batchShapingNeedSink = new BatchShapingNeedSink()) {ps: 
 Ist euch schonmal folgendes abgegangen?try { ... } finally { CleanupThiny1ThatCanThrow(); } finally { CleanupThiny2ThatCanThrow(); } finally { CleanupThiny3ThatCanThrow(); } finally { CleanupThiny4ThatCanThrow(); }? 
 
- 
					
					
					
					
 Na ja, das ist ja nur ein Frage der Code-Formatierung: for (int i=0; i<10; i++) for (int j=0; j<10; j++) Console.WriteLine("{0}, {1}", i, j)oder if (x > y) if (x > z) x = y + z;:p 
 
- 
					
					
					
					
 Dann zeig mal wie das für try-finally aussehen würde. Davon abgesehen: jegliche Formatierung die VS nicht kann ist ziemlich uninteressant. Ich kämpfe nicht mehr gegen das System. 
 Wenns Plugins gibt die besser formatieren und sich nahtlos integrieren (Auto-Format beim Tippen von ";" usw.), OK. Immer noch doof für Leute die das Plugin dann nicht haben, aber damit könnte ich leben.Aber manuell formatiere ich nix mehr was das nächste Ctrl+K, Ctrl+F nicht überlebt. Bin ja kein Masochist. ps: Ich find's schrecklich dass man bei VS die Formatierungsregeln nicht zum Projekt dazuhängen kann. Wenn jmd. ein Plugin kennt das hier abhilft: bitte melden  
 
- 
					
					
					
					
 Für automatische Code-Formatierung im VS empfehle ich {url=http://www.codemaid.net/]CodeMaid[/url]. PS: Ich bezog mich bei meinem vorherigen Beitrag auf den von freaky. 
 Selber nutze ich bei mehreren [i]using[i] auch eure Schreibweise - mir ging es nur um das Verständnis.
 
 
			
			
		 
			
			
		 
			
			
		