Visual Studio 2010 - Break on anything that changes an object property - c#

Is it possible in Visual Studio 2010 to break on anything (a method for example) that changes an object's property?
Or is it possible to find out if object properties changed in an ASP.NET Webforms application?
Update:
Correct answer can be found at: http://stackoverflow.com/questions/2682613/cant-set-breakpoints-on-an-auto-property-setter-why/6713920#6713920

If you have control over the code that declares the property, then certainly you can put a breakpoint inside the setter. Even if it is currently an auto-implemented property, e.g.:
public string SomeProperty { get; set; }
you can easily change it like this:
private string _someProperty;
public string SomeProperty {
get { return _someProperty; }
set {
// Set breakpoint here, or type Debugger.Break();
_someProperty = value;
}
}
If the value is actually a field instead of a property, you can still change it into a property to achieve the same thing.
If you don’t have access to the code that declares the property, then it’s quite a bit harder. Personally what I do is this, but it’s a bit laborious:
Declare a public static field in your Program class of the type that declares the property.
Early in the program, find a reference to the object whose property value changes and put that reference in this static field. If necessary, use Reflection to retrieve private fields.
Add global::MyNamespace.Program.MyField.ImportantProperty to the Watch window while debugging.
Step through the code until the value in the watch window changes.

It sounds like you're asking for a feature that would cause Visual Studio to break whenever a property / field is changed on an object.
For properties you can do this with normal breakpoints and a conditional. Simply set the breakpoint on the property setter, right click and select conditional. Then add a simple check to see if the new value and existing value are different
value != backingField
For fields there really is no good solution. The C++ debugger has a feature called Data BreakPoints which have exactly this behavior. But they are not available for managed languages, primarily because the CLR debugger does not support them. The best you can do is temporarily change your field to a property and use the above method.

Right click the red dot that represents the breakpoint - choose Condition and enter expression when you want the breakpoint to break the execution, or check Has changed to break whenever the value changes.

I don't think that there is a way in VS IDE that allows you to set a general breakpoint like that. If you really need this and willing to do some code changes, you can take a look at partial methods. Using partial methods, you define a partial method and call it from your setters. When you want to debug to find out who's calling a setter, you can provide a dummy implementation of the partial method. When you are done debugging, you can get rid of the implementation and the compiler will not generate anything related to that method as if it did not exist. This pollutes your code unless you can think of other potential uses of a partial method call from your setters. However, I just wanted to throw it out there so that you know.

You can use System.Diagnoistic.Debugger.Break() method for its purpose as follows
if(x!= y)
Debugger.Break()

Related

C# getters and setters method definition - beginner

I am new to C#. i was going through a tutorial. and it shows how to create accesor-mutator to a variable as shown below;
public String var1 {
get {return "";}
set {someVar = value;}
}
1.) Can't i create getters and setter like created in java
public getVar() {return "";}
public setVar(String x){var=x;}
2.) What is value used in C# ?
You can, but that's much more annoying to use, and ignores C# coding guidelines.
value is the implicit parameter to the setter. It contains the value that the caller is setting the property to. (the right side of the Property = something call)
See the documentation.
Sure you can. Properties in C# are designed to be syntactic sugar for just that. Under the hood a property is little more than a get/set method. It's just easier to create the two methods, it keeps the two methods in one place in the source code, it has simpler syntax for the caller, and properties that do nothing but just get/set a value are easier still to generate.
It's a keyword. It is the value that is being passed into the method. If someone enters obj.var1 = "abc"; then value will be a reference to "abc".
Sure, you can do it like Java. But why? Property syntax allows a much better experience from the caller's point of view.
value is a pseudo-variable that you can use to set your internal variable with, etc. It's equivalent to x in your Java-like example.
yes you can create getter setters as in java
example
int marks;
public void setMarks(int marks)
{
this.marks=marks;
}
public int getMarks()
{
return marks;
}

Difference between get_Offset and Offset?

I do not understand the difference between get_Offset and Offset:
MSDN on NamedRange.get_Offset states
This API supports the Visual Studio infrastructure and is not intended
to be used directly from your code. Use the Offset property instead of
this method.
What does that mean exactly? Similar is also said for get_Value method which is widely used directly in code.
Take following examples which would do the same for me.
myRange.get_Offset(1,0).Value = "Foo";
myRange.Offset[1,0].Value = "Foo";
What are their difference?
get_Something
is an internal function that generates by the CLR for property get accessor.
For example if you have a property
public string Name {get;set;}
after compilation you will find a
get_Name and set_Name methods, cause the properties are nothing then simple wrappers over the set-variable/get-variable concept in a single class domain.
Being an internal method, it's not good practise to make use of it, it's better to use a user defined, clear property access.
get_Offset can theoretically be changed or removed without warning. If the documentation says to use another equivalent method you should do just that.
get_Value is only marked that way for Visual Studio 2005 so you can use that freely
The difference is exactly as the documentation says. You should use the Offset property, not the get_Offset method.
The method is just public because they needed it to be accessible in that way for some other class. The method may just go away in any future version if they find a better way to use the class, and it won't even be mentioned as a breaking change as the documentation clearly states that you shouldn't use it.

Difference between empty property declaration [duplicate]

This question already has answers here:
Closed 11 years ago.
Possible Duplicate:
C# getters, setters declaration
What's the difference between these property declarations ? How do they work and why is one preferred.
public string aString {get;set;}
OR
private string bString = "";
public string aString
{
get { return bString; }
set { bString = value; }
}
NOTE : THis is not a urgent or important question , rather a matter of asking the people who know why something should be done a certain way. Also, please give examples of which scenario is best for each implementation.
First is automatic property and the second is classic property that we have known.
In C# 3.0 and later, auto-implemented properties make
property-declaration more concise when no additional logic is required
in the property accessors. They also enable client code to create
objects. When you declare a property as shown in the following
example, the compiler creates a private, anonymous backing field that
can only be accessed through the property's get and set accessors.
When you don't have any special logic to add in the get and set part property then you can just use automatic property since its less code and less code means easier maintenance and less bugs.
You should switch to classic property syntax only if you need to add some logic (like validation) on the property.
Design:
Use second if you need to do something in exact moment of assignment (raise an event , change other fields, save undoredo information, write to a file and tons of other possibilities).
Practical: Use second if you need simply to debug, as you can not put a breakpoint on autogenerated property.
Use first in all other cases.
The most obvious difference is that you can't set the aString variable and return it, since you always return bString...
One difference is that in the case of automatic property you can't have a private setter. This is just a language shortcut or syntax sugar to make things easier to develop (also generated code looks cleaner...).
If you look at the compiled assembly the compiler made exact the same code as in the "classic" variation.

Why isn't there a warning on identity assignment?

I've made this mistake a number of times - it happens when I'm working quickly and using code completion. I end up with code like the following:
public class Model : IModel
{
public PropertyNames PropertyNames { get; set; }
public Model(PropertyNames propertyNames)
{
PropertyNames = PropertyNames;
}
}
Then a test fails in a slightly less than obvious way, and I get bummed out.
I'm just curious if there's a valid reason to write code like that, ever, and if not, then does it make for a good candidate to generate a warning?
I'm just curious if there's a valid reason to write code like that, ever
Depending on how you look at, unfortunately yes there is. Because the identifier we are talking about is a property, assigning a property to a property sounds like a no-op but it actually invokes methods, the getter and the setter, and those methods might have side effects.
A specific case that is very common is if the setter does something like property notification or calls an observer but anything could happen when you call either the getter or the setter. This is why the code does not generate a warning: because this coding style is actually useful and used in production code.
Edit:
By comparison, if the identifier is a field and not a property, it does generate this warning:
warning CS1717: Assignment made to same variable; did you mean to assign something else?
Use FxCop (aka Code Analysis), it will give you the warning:
Warning 3 CA1801 : Microsoft.Usage : Parameter 'propertyNames' of 'Model.Model(string)' is never used. Remove the parameter or use it in the method body.
Other than "it counts as a valid instruction", there's no reason to ever use this. That said, it's also not wrong: it conforms the syntax for assignment.
If you are writing a code validator, then this is a good candidate for a warning, although of course it should never hamper actual compiling; most compilers already catch this kind of operation during bytecode optimisation, where instructions that do not perform any control logic and don't actually modify registers are removed.

Get PropertyInfo from property instead of name

Say, for example, I've got this simple class:
public class MyClass
{
public String MyProperty { get; set; }
}
The way to get the PropertyInfo for MyProperty would be:
typeof(MyClass).GetProperty("MyProperty");
This sucks!
Why? Easy: it will break as soon as I change the Name of the Property, it needs a lot of dedicated tests to find every location where a property is used like this, refactoring and usage trees are unable to find these kinds of access.
Ain't there any way to properly access a property? Something, that is validated on compile time?
I'd love a command like this:
propertyof(MyClass.MyProperty);
The closest you can come at the moment is to use an expression tree:
GetProperty<MyClass>(x => x.MyProperty)
and then suck the PropertyInfo out in GetProperty (which you'd have to write). However, that's somewhat brittle - there's no compile-time guarantee that the expression tree is only a property access.
Another alternative is to keep the property names that you're using somewhere that can be unit tested easily, and rely on that.
Basically what you want is the mythical infoof operator which has been talked about many times by the C# team - but which hasn't made the cut thus far :(
In the time since this question was posted, C# 6 has been released with the nameof operator. This allows a property to be accessed with the following
PropertyInfo myPropertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty));
If you rename the property, this code will not compile (actually it will, since the rename will change this line of code as well if the rename is done properly).
The whole point of reflection is to be able to access stuff at runtime. If we assume your operator would work, you already have the class information and thus the property, making the whole thing completely useless.

Categories

Resources