Solved

C# Method Return Structure by Reference

Posted on 2010-11-11
6
899 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
  • 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
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 

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

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

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
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

803 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