• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 923
  • Last Modified:

C# Method Return Structure by Reference

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
Cyber-Storm
Asked:
Cyber-Storm
  • 3
  • 2
2 Solutions
 
Carl TawnSystems and Integration DeveloperCommented:
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
 
Richard LeeSoftware EnthusiastCommented:
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
 
Cyber-StormAuthor Commented:
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
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
Cyber-StormAuthor Commented:
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
 
Richard LeeSoftware EnthusiastCommented:
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
 
Cyber-StormAuthor Commented:
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

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now