|
1nsp1r3d wrote: As I was reading C# Language Pocket Reference, it says that all parameters are passed by value(ASAIK the book targets .NET 1.0).
Correct, unless the ref modifier is used.
1nsp1r3d wrote: I thought that all reference types were passed by reference and all value types by value(enums and ints/floats/etc)? Is that the case?
Nope.
When a reference variable is passed to a method, it is by default passed by value. So if you were to do something like this:
public void SomeMethod(string name)
{
name = "B";
}
Only the local name variable is changed. The reference variable passed to the method is not changed:
string name = "A";
SomeMethod(name);
So when a reference variable is passed to a method, it is passed by value by default. A copy of the variable is what is actually passed to the method. This local copy references the same object in memory as the original variable, but they are two distinct variables. Changes on the local variable itself does not change the original.
However, if you use the ref modifier, you have a reference to a reference, so to speak. So given our above example:
public void SomeMethod(ref string name)
{
name = "B";
}
string name = "A";
SomeMethod(ref name);
Changes to the variable itself are reflected in the original.
|
|
|
|
|
string is a bad example, because it is immutable, so when you cannot actually change it. Each time you are creating a new string object.
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
|
|
|
|
|
1nsp1r3d wrote: I thought that all reference types were passed by reference and all value types by value(enums and ints/floats/etc)? Is that the case?
Yes, you are correct.
Consider this small application:
using System;
namespace ConsoleApplication12
{
class A
{
private string someValue;
public string SomeValue
{
get
{
return this.someValue;
}
set
{
this.someValue = value;
}
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("In the Main method");
A mainA = new A();
mainA.SomeValue = "This was set in the main method";
Console.WriteLine(mainA.SomeValue);
AnotherMethod(mainA);
Console.WriteLine(mainA.SomeValue);
Console.ReadLine();
}
static void AnotherMethod(A parameterA)
{
Console.WriteLine("In AnotherMethod");
Console.WriteLine(parameterA.SomeValue);
parameterA.SomeValue = "This value was set in AnotherMethod";
Console.WriteLine(parameterA.SomeValue);
Console.WriteLine("Exiting AnotherMethod");
}
}
}
The output would be:
In the Main method
This was set in the main method
In AnotherMethod
This was set in the main method
This value was set in AnotherMethod
Exiting AnotherMethod
This value was set in AnotherMethod
As you can see, the object of class A is passed by reference because when its property is updated in the method, the update is reflected in the Main method after the call.
Does this help?
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
|
|
|
|
|
Colin Angus Mackay wrote: As you can see, the object of class A is passed by reference because when its property is updated in the method, the update is reflected in the Main method after the call.
I'm sorry, but this isn't corrent. The variable mainA is passed by value to AnotherMethod . The parameterA is another variable that references the same object in memory as mainA .
Changing the property value in AnotherMethod changes the object that is being referenced by both mainA and parameterA . That is why the change is reflected outside of AnotherMethod .
Operations on parameterA itself are not reflected outside of that method:
static void AnotherMethod(A parameterA)
{
Console.WriteLine("In AnotherMethod");
Console.WriteLine(parameterA.SomeValue);
parameterA = new A();
parameterA.SomeValue = "This value was set in AnotherMethod";
Console.WriteLine(parameterA.SomeValue);
Console.WriteLine("Exiting AnotherMethod");
}
If you were to pass mainA by reference, changes to parameterA itself would also change mainA .
static void AnotherMethod(ref A parameterA)
{
Console.WriteLine("In AnotherMethod");
Console.WriteLine(parameterA.SomeValue);
parameterA = new A();
parameterA.SomeValue = "This value was set in AnotherMethod";
Console.WriteLine(parameterA.SomeValue);
Console.WriteLine("Exiting AnotherMethod");
}
|
|
|
|
|
Ah... Yes, I see what you mean. You are correct. I guess I made part of the mistake I was trying to show not to make.
What I was trying to say was that you create an object in one method and pass it to another method. The other method can update the object and the changes would be reflected in the calling method. Of course, I failed to mention that if you assign a new instance of class A to the parameter value then it wouldn't be reflected because that would be local to the method.
Anyway, everything's sorted out now.... I hope....
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
|
|
|
|
|
Colin Angus Mackay wrote: Anyway, everything's sorted out now.... I hope....
It's kinda tricky to wrap your head around. I started out with C years ago where things were on a much lower level than in C#. So you would deal with pointers directly instead of the higher level references C# gives you.
I can remember years ago doing something like this (in C):
void SomeMethod(int *pointer)
{
pointer = malloc(42);
}
And calling this function elsewhere:
int *p;
SomeMethod(p);
p[0] = 0;
And wondering why memory wasn't being assigned to the variable passed into SomeMethod .
I posted to comp.lang.c, not for the faint of heart, and was told rather sternly that the reason the variable being passed to the function wasn't being updated is that it was being passed by value. Think of the pointer has having a value, and that value is the address of the memory it points to. This value is what is passed to the function and is stored in the parameter variable. If I change the parameter variable itself, such as assigning memory to it, it's not reflected outside of the function.
That's when I learned about the wonderful "pointers to pointers." So what I needed to do (and my C is really rusty, so pardon me if this isn't exactly correct), is:
void SomeMethod(int **pointer)
{
*pointer = malloc(42);
}
And calling this function elsewhere:
int *p;
SomeMethod(&p);
p[0] = 0;
Now, I'm not sure how things are under the covers in C#, so only take my C example as an analogy of how things might work in C#. But the concepts are the same.
The reference variables reference, or point, to an object somewhere. When a reference variable is passed to a method, its value is passed to the method and stored in the parameter variable. So the parameter variable references the same object; it has the same value. Operations, such as setting properties, calling methods, etc., performed on on the parameter variable local to the method are performed on the same object referenced by the variable passed to the method.
Pointers to pointers are the equivalent of using the ref modifier in C#. ref gives you a reference to a reference so that operations performed on the parameter variable are reflected outside of the method. Think of a ref variable as a reference to the variable itself that was passed to the method.
Well, hopefully some of that makes sense.
|
|
|
|
|
Leslie Sanford wrote: and my C is really rusty, so pardon me if this isn't exactly correct
I haven't done C++ in about 5 years now. I understand what you mean though.
Leslie Sanford wrote: Well, hopefully some of that makes sense.
Absolutely.
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
|
|
|
|
|
Okay - I guess I made some mistakes with my explanation.
1nsp1r3d wrote: I thought that all reference types were passed by reference and all value types by value(enums and ints/floats/etc)?
A reference type is passed by reference insofaras you can update the object in the method and the changes will be reflected back in the original, but you cannot assign a new object.
If you use ref you are passing a reference to a reference and you can assign a new object in the method and have that new object reflected in the calling method.
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
-- modified at 11:03 Thursday 24th November, 2005
|
|
|
|
|
I discovered a great feature of new VS 2005 - to allow use of Classes as datasources for reports.
I created a simple class with a couple of public string fields that source my report and they show quite happily in report viewer. Great functionality.
Now, I am trying to see if I can source an Array-like type to report and get it to show the data. For example say I have a Book class, that will conain name of the Author, number of pages, price and a HashTable (or another suitable) of characteristics: size, page colors and index.
Something like:
public HashTable OtherVals
{
get{
HashTable my = new HashTable();
my.Add("size","10x15");
my.Add("PageColor", "green");
return my;
}
}
How can this be shown on report?
Rewording of this quetsion below...
the .rdls report templates, when a Class is used as its datasource - what sort of data types can it handle?
In other words - strings work great, ints etc... How about ArrayList() or HashTable() or something that will allow me pass a list of 5 items into the report and show them in a list.
Thanks a lot!
Alexander Bolotnov
|
|
|
|
|
Hi,
I am converting a decimal value to string for displaying it on a label.
While converting the decimal value with two decimal places to string, 4 more zeroes are being appended to the decimal value.
eg: "45.52" is displaying as "45.520000" on label after using the following statement:
decimal d = 45.52
lblNetPrice.Text = Convert.ToString(d);
What I need to do for displaying 2 decimal values on the label other than using the substring function?
Thanks in advance.
Subrahmanyam K
|
|
|
|
|
lblNetPrice.Text = String.Format("{0:#.##}",d);
/edit: helps if you get the format right
-- modified at 8:05 Thursday 24th November, 2005
|
|
|
|
|
Instead of this:-
Subrahmanyam K wrote: decimal d = 45.52
lblNetPrice.Text = Convert.ToString(d);
try this:-
decimal d = 45.52
lblNetPrice.Text = d.ToString("###,##0.00")
Cheers,
Craig
** I'd rather try and fail than fail to try **
|
|
|
|
|
hello all,
i am working with windows control library . i am using three dll in my project. which ever dll i am using i have to make strong name for that.my problem is that i am not to able make strong name more than one. in Assemblyinfo.cs i used the following coding
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"..\..\..\filename.snk")]
[assembly: AssemblyKeyName("")]
after that use GAC to put into the assembly. for each dll i have to make .snk key pair. but when i use AssemblyKeyFile() more than once in assembleinfo.cs it gives me error duplicate assembleykeyfile() file attribute. how could i use more than one dll in our project.
Amit Grover
CDAC R&D
Gist Group
pune
|
|
|
|
|
The AssemblyKeyFile attribute is used to *build* a strong named assembly, you don't need it for referring to a strong named assembly.
So you need to have the attribute in the AssemblyInfo.cs file of each of the DLL projects, that's it.
Regards
Senthil
_____________________________
My Blog | My Articles | WinMacro
|
|
|
|
|
i don'nt know how would to add entries in assembleInfo.cs for each of the dll's. plz send the code if possible
Amit Grover
CDAC R&D
Gist Group
pune
|
|
|
|
|
hi guys, need help with this one.. im building a client agent that would collect software and hardware data on my network's client PCs.. and i want that program to send data to my license server/database everytime a user opens an application/program... how can i be able to accomplish this task?? do i need to use webservices or windows services?? need your advice guys.. thanks a lot..
|
|
|
|
|
I want to create a web editor to generate XML. I use ASP.NET c# and javascript.
If someone knows how or has done something like it I will appreciate any help.
Thanks
Tony
|
|
|
|
|
What exactly do you want help with... your question is akin to asking "I want to build a website, how do I do it?"
|
|
|
|
|
I want to build a wysiwyg to generate XML without having to type any XML.
Thanks
Tony
|
|
|
|
|
You need to at least TRY something yourself, when you hit a specific problem feel free to post a question remembering to include any code and eror messages.
Nobody could answer "How to build an XML Editor" in a single post! If you just want an example there will be many available by doing a search on google.
|
|
|
|
|
How can I make a Line Graph in VC#.net wherein the X and Y axis data are obtained from user's input? Please help!
|
|
|
|
|
Hi All
I'm not completely sure whether this is the best place for this question but someone out there may be able to provide suggestions. I am in the process of designing an Inventory system which holds details about object within our department. This can include books, software, logbooks etc. The aim is that it will allow loans as well as maintain project information about logbooks, staff information etc.
Now I originally designed a database, creating an E-R diagram to ascertain the tables etc in which to store the information. The intention was then to produce a C# front end to display the information and control access etc. Now my question is this.... Do I need to go through the design process (Analyis, design etc) in UML for the C# part of the application or do I simply gear the front-end to the structure of the database? If I do serperate analysis and design then the models produced for the C# part of the application add various classes etc that are not accounted for in the database.
What is the general approach to this sort of application? How do people go about designing it? Say the database has a table for books and one for software... I find that the analysis for a C# application provides a generalisation such as InventoryItem... I hope this makes sense.... What I really want to know is how people go about designing this sort of application.
Any help or guidance would be gratefully appreciated
Cheers
Jamie
|
|
|
|
|
Hi,
I am using WinWordConrol in my C# project.
I want to HighLigt a particular selected text in my document but Word.Document
object does not have any option for HighLight property.
It is possible by using Shading property but i dont want to use Shading property.
doc.Application.Selection.Shading.ForegroundPatternColorIndex=ColorIndex;
where doc is Word.Document object.
Is there any way by which i can use HighLigth.
|
|
|
|
|
subject tells about everything. I cannot go on to my gradution project. Please help me about this subject. I can read information with SDK but i cannot read anything else. Kit connects to computer through serial port. I tried many serial port programs under .NET framework 2.0 but it doesnot work. Is there anyone can send me a example code for this.
My antenna is ANT34-24
reader is MR100A
Thanks
|
|
|
|
|
Hi Friends,
I am developing scheduler application using C#. For displaying all
schedule information i am using ListView control. Based on the status
of the schedule, i have displayed the schedule information in the list
view as seperate colors.
I have faced the problem with deselecting the list view item. For
example, if i select the first row,(with blue color) of the list view
and deactivate the selected item by clicking the row which has no
elements, the color for the first row not appear, it appear as white
color. I just apply refresh method also. but i didn't get the actual
color at the row.
Please help me to solve this issue.
Regards,
Prakash.
A Journey of thousand miles must begin with a single step.
|
|
|
|