How does the method work ?
-
Hello there, Would you please explain , how the below method (that is bold) works ?
public class RelayCommand : ICommand
{
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;**public RelayCommand(Action<object> execute) : this(execute, null) { }** public RelayCommand(Action<object> execute, Predicate<object> canExecute) { if (execute == null) throw new ArgumentNullException("execute"); \_execute = execute; \_canExecute = canExecute; } \[DebuggerStepThrough\] public bool CanExecute(object parameter) { return \_canExecute == null ? true : \_canExecute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { \_execute(parameter); }
}
I mean , what's the meaning of
: this(execute, null)
? -
Hello there, Would you please explain , how the below method (that is bold) works ?
public class RelayCommand : ICommand
{
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;**public RelayCommand(Action<object> execute) : this(execute, null) { }** public RelayCommand(Action<object> execute, Predicate<object> canExecute) { if (execute == null) throw new ArgumentNullException("execute"); \_execute = execute; \_canExecute = canExecute; } \[DebuggerStepThrough\] public bool CanExecute(object parameter) { return \_canExecute == null ? true : \_canExecute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { \_execute(parameter); }
}
I mean , what's the meaning of
: this(execute, null)
?It calls the constructor below it: it's like base(whatever). The point is to avoid duplicating whatever functionality is in the two-parameter method.
-
It calls the constructor below it: it's like base(whatever). The point is to avoid duplicating whatever functionality is in the two-parameter method.
Thanks, What's the name of these methods ? Is there a specific name for these methods ?
-
Thanks, What's the name of these methods ? Is there a specific name for these methods ?
It works on constructors only, i.e. methods that: - have no return type; - have a name identical to the class name; - get invoked using the
new
keyword. :)Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that.
[The QA section does it automatically now, I hope we soon get it on regular forums as well]
modified on Friday, February 5, 2010 4:29 PM
-
It works on constructors only, i.e. methods that: - have no return type; - have a name identical to the class name; - get invoked using the
new
keyword. :)Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that.
[The QA section does it automatically now, I hope we soon get it on regular forums as well]
modified on Friday, February 5, 2010 4:29 PM
Got it ;)
-
It calls the constructor below it: it's like base(whatever). The point is to avoid duplicating whatever functionality is in the two-parameter method.
So,
this(execute, null)
means something likebase(execute, null)
:confused: -
So,
this(execute, null)
means something likebase(execute, null)
:confused:No, they are different. use
base
to refer to the base class, the class from which the current class derives.this
refers to some other constructor of the current class; the normal use is: - one implements the "full" constructor, the one taking most parameters; - then one refers all other constructors to the first one, by providing default parameters for the missing ones. See your own example. :)Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that.
[The QA section does it automatically now, I hope we soon get it on regular forums as well]
modified on Friday, February 5, 2010 4:28 PM
-
Hello there, Would you please explain , how the below method (that is bold) works ?
public class RelayCommand : ICommand
{
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;**public RelayCommand(Action<object> execute) : this(execute, null) { }** public RelayCommand(Action<object> execute, Predicate<object> canExecute) { if (execute == null) throw new ArgumentNullException("execute"); \_execute = execute; \_canExecute = canExecute; } \[DebuggerStepThrough\] public bool CanExecute(object parameter) { return \_canExecute == null ? true : \_canExecute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { \_execute(parameter); }
}
I mean , what's the meaning of
: this(execute, null)
?this(execute, null) passes the call through to the second constructor - setting the predicate to null. As you can't call a constructor by name, you need to do this to actually call the second constructor. As you know, in a method, you can do the following:
public void DoThis(int index)
{
DoThis(index, null);
}public void DoThis(int index, string message)
{
}While it would be nice to do this with a constructor, you can't:
public MyClass()
{
MyClass(null);
}public MyClass(string message)
{
}In order to get the same effect, you modify the constructor definition instead.
public MyClass() : this(null)
{
}public MyClass(string message)
{
}Now, this differs from calling
base
which invokes a method on the parent class, rather than this class. What you can't do, is combinethis
andbase
in a constructor - it's one or the other."WPF has many lovers. It's a veritable porn star!" - Josh Smith
As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
-
this(execute, null) passes the call through to the second constructor - setting the predicate to null. As you can't call a constructor by name, you need to do this to actually call the second constructor. As you know, in a method, you can do the following:
public void DoThis(int index)
{
DoThis(index, null);
}public void DoThis(int index, string message)
{
}While it would be nice to do this with a constructor, you can't:
public MyClass()
{
MyClass(null);
}public MyClass(string message)
{
}In order to get the same effect, you modify the constructor definition instead.
public MyClass() : this(null)
{
}public MyClass(string message)
{
}Now, this differs from calling
base
which invokes a method on the parent class, rather than this class. What you can't do, is combinethis
andbase
in a constructor - it's one or the other."WPF has many lovers. It's a veritable porn star!" - Josh Smith
As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
excellent, I've got it. :rose:
-
No, they are different. use
base
to refer to the base class, the class from which the current class derives.this
refers to some other constructor of the current class; the normal use is: - one implements the "full" constructor, the one taking most parameters; - then one refers all other constructors to the first one, by providing default parameters for the missing ones. See your own example. :)Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that.
[The QA section does it automatically now, I hope we soon get it on regular forums as well]
modified on Friday, February 5, 2010 4:28 PM
very good, Thanks dude ;)