Solved

C# Method Return Structure by Reference

Posted on 2010-11-11
6
911 Views
Last Modified: 2012-05-10
Hi,

Is it possible to return a structure by reference?

Example:
public struct myStruct
{
string foo;
string bar;
}

public myStruct[] Instances;
Instances = new myStruct[1];
Instances[0].foo = "Hello";
Instances[1].bar = "World";

public myStruct getInstance()
{
return Instances[0];
}

myStruct instance = getInstance();

This will return a copy of the structure, I want it to return the reference to it so I can do this:
myStruct instance = getInstance();
instance.foo = "Source";
instance.bar = "Code";

I know I can pass instance as a reference variable:
myStruct instance = new MyStruct();
getInstance(ref instance);

But I don't want to do this if I don't have to.

Many thanks,
Storm
0
Comment
Question by:Cyber-Storm
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 100 total points
ID: 34110227
The only way I can thing of doing it would be to return a pointer, but i don't think you want to be doing that.
0
 
LVL 18

Accepted Solution

by:
Richard Lee earned 150 total points
ID: 34110318
The simple answer is no. Are there ways around it? maybe.

http://msdn.microsoft.com/en-us/library/dd183752.aspx

Notice instead of using MyStruct for the array construction I am using object. I am boxing the structure inside and object therefore the object are moved around by reference.

DaTribe
class Program
{
	public struct myStruct
	{
		public string foo;
		public string bar;
	}

	public static object[] Instances;

	public static object getInstance()
	{
		return Instances[0];
	}

	static void Main(string[] args)
	{
		Instances = new object[2];

		Instances[0] = new myStruct {foo = "Hello"};
		Instances[1] = new myStruct {bar = "World"};

		var instance = getInstance();
		Console.WriteLine(object.ReferenceEquals(instance, Instances[0]));
		Console.ReadKey();
	}
}

Open in new window

0
 

Author Comment

by:Cyber-Storm
ID: 34110321
Yeah, wouldn't want to go the unsafe route, how would I fix the below then?
public struct myStruct
{
string foo;
string bar;
}

public myStruct[] Instances;
Instances = new myStruct[1];
Instances[0].foo = "Hello";
Instances[1].bar = "World";

public int getInstanceID()
{
return 0;
}

Now am forced to do this
Instances[getInstanceID()].foo = "Source";
Instances[getInstanceID()].bar = "Code";
but I want to do something like this instead
myStruct instance = Instances[getInstanceID()];

so that I can do this:
instance.foo = "Source";
instance.bar = "Code";
Thanks
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Cyber-Storm
ID: 34110382
Thanks DaTribe,
We posted at the same time so I didn't see yours.  I wouldn't want to go the object route as it's concidered a "dirty" solution.  But I fully understand your logic and while I know doing it this way would work, I was hoping for a "cleaner" solution and was reserving that as my last resort if I didn't come right here.
0
 
LVL 18

Expert Comment

by:Richard Lee
ID: 34110449
The link I provided explains that it is not possible for two structs to have the same address so I do not think the approach you require is possible.

http://msdn.microsoft.com/en-us/library/dd183752.aspx

DaTribe
0
 

Author Closing Comment

by:Cyber-Storm
ID: 34111629
I implemented a class instead of a structure and exposed the variables as automatic properties, I think this is the cleanest and most elegant solution in this case.

Both good options you guys put forth as well, thanks guys.
0

Featured Post

MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Extention Methods in C# 3.0 by Ivo Stoykov C# 3.0 offers extension methods. They allow extending existing classes without changing the class's source code or relying on inheritance. These are static methods invoked as instance method. This…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
There are cases when e.g. an IT administrator wants to have full access and view into selected mailboxes on Exchange server, directly from his own email account in Outlook or Outlook Web Access. This proves useful when for example administrator want…
There's a multitude of different network monitoring solutions out there, and you're probably wondering what makes NetCrunch so special. It's completely agentless, but does let you create an agent, if you desire. It offers powerful scalability …

691 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question