Je complète en disant que cela va générer le même code que dans la 1ere solution, mais ça sera plus propre.
Version imprimable
Je complète en disant que cela va générer le même code que dans la 1ere solution, mais ça sera plus propre.
C'est top, merci.
@tomlev :
Je vais tâcher de jeter un coup d’œil sur la discussion, je ne me suis pas encore vraiment penché sur roslyn et certains de ses aspects m'échappent.
Pour les littéraux, en effet ce ne sera pas ajouté, mais comme j'en manipule occasionnellement ça m'aurait intéressé x)
Ah oui, je me rappelle now que tu le soulignes pour le tuple x)
@Tidus, autre exemple typique pour nameof :
L'avantage par rapport à new ArgumentNullException("name") est multiple :Code:
1
2
3
4
5
6
7 public void SayHello(string name) { if (name == null) throw new ArgumentNullException(nameof(name)); Console.WriteLine($"Hello {name}"); }
- l'Intellisense te propose le nom du paramètre
- le compilateur vérifie que le nom que tu as mis correspond bien à quelque chose qui existe
- les outils de refactoring sont capables de modifier l'instruction si tu renommes le paramètre.
Dans la même veine, pour INotifyPropertyChanged, même si on sait déjà faire autrement. (J'aime beaucoup ton exemple tomlev)
En fait pour INotifyPropertyChanged il y a déjà un truc encore mieux depuis C# 5 : les caller info attributes, qui permettent de passer implicitement le nom de la propriété en paramètre.
J'utilise généralement une classe de base de ce style pour mes ViewModels:
Ce qui permet de faire des choses comme ça :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class ObservableBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(new PropertyChangedEventArgs(propertyName)); } protected bool Set<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null) { if (EqualityComparer<T>.Default.Equals(field, newValue)) return false; field = newValue; OnPropertyChanged(propertyName); return true; } }
Ou encore comme ça, en utilisant aussi nameof :Code:
1
2
3
4
5
6 private string _name; public string Name { get { return _name;} set { Set(ref _name, value); } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 private string _firstName; public string FirstName { get { return _firstName;} set { if (Set(ref _firstName, value)) OnPropertyChanged(nameof(FullName)); } } private string _lastName; public string LastName { get { return _lastName;} set { if (Set(ref _lastName, value)) OnPropertyChanged(nameof(FullName)); } } public string FullName => FirstName + " " + LastName;
Ah tiens pas bête, je ne pense jamais à cet élément