Is there a way I can return more than one integer from a method? [duplicate]How can I return multiple values from a function in C#?Returning two lists in C#Hidden Features of C#?Randomize a List<T>Best way to repeat a character in C#Proper use of the IDisposable interfaceDoes C# have extension properties?Get int value from enum in C#How do I remedy the “The breakpoint will not currently be hit. No symbols have been loaded for this document.” warning?Group by in LINQIs there a reason for C#'s reuse of the variable in a foreach?d is less efficient than [0-9]
Is there a way to make member function NOT callable from constructor?
Is "plugging out" electronic devices an American expression?
How can I add custom success page
Extreme, but not acceptable situation and I can't start the work tomorrow morning
COUNT(*) or MAX(id) - which is faster?
What happens when a metallic dragon and a chromatic dragon mate?
Is ipsum/ipsa/ipse a third person pronoun, or can it serve other functions?
Re-submission of rejected manuscript without informing co-authors
Can the Produce Flame cantrip be used to grapple, or as an unarmed strike, in the right circumstances?
Why do we use polarized capacitors?
Does the average primeness of natural numbers tend to zero?
What is the meaning of "of trouble" in the following sentence?
Where else does the Shulchan Aruch quote an authority by name?
If a centaur druid Wild Shapes into a Giant Elk, do their Charge features stack?
Landlord wants to switch my lease to a "Land contract" to "get back at the city"
Is every set a filtered colimit of finite sets?
Pristine Bit Checking
extract characters between two commas?
Is it legal to have the "// (c) 2019 John Smith" header in all files when there are hundreds of contributors?
Piano - What is the notation for a double stop where both notes in the double stop are different lengths?
Is there a name of the flying bionic bird?
Does it makes sense to buy a new cycle to learn riding?
What does "enim et" mean?
What to wear for invited talk in Canada
Is there a way I can return more than one integer from a method? [duplicate]
How can I return multiple values from a function in C#?Returning two lists in C#Hidden Features of C#?Randomize a List<T>Best way to repeat a character in C#Proper use of the IDisposable interfaceDoes C# have extension properties?Get int value from enum in C#How do I remedy the “The breakpoint will not currently be hit. No symbols have been loaded for this document.” warning?Group by in LINQIs there a reason for C#'s reuse of the variable in a foreach?d is less efficient than [0-9]
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
This question already has an answer here:
How can I return multiple values from a function in C#?
26 answers
I have a method like this:
private double GetHeight()
return 2;
But I would like to be able to return two different numbers for example 2 and 3. Is there any way that I can do this in C#?
c#
marked as duplicate by Mormegil, Soner Gönül
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
13 hours ago
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
How can I return multiple values from a function in C#?
26 answers
I have a method like this:
private double GetHeight()
return 2;
But I would like to be able to return two different numbers for example 2 and 3. Is there any way that I can do this in C#?
c#
marked as duplicate by Mormegil, Soner Gönül
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
13 hours ago
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
return array if you need more values
– Shubham
16 hours ago
1
This probably is exactly what you need
– Jordi
16 hours ago
2
for clarity: does your method always return the same number of return values (each with specific semantic meaning) - or is the number of return values dynamic, i.e. sometimes it'll be 1 (or maybe even zero), and other times it might be 20? It matters a lot. For the fixed number scenario: any of the tuple-ish answers are good; for the dynamic scenario: the array/list approaches are good.
– Marc Gravell♦
16 hours ago
How does this question have so many upvotes? The question lacks a significant amount of effort and a simple search on the internet would've provided the answer stackoverflow.com/help/how-to-ask
– Denny
12 hours ago
add a comment |
This question already has an answer here:
How can I return multiple values from a function in C#?
26 answers
I have a method like this:
private double GetHeight()
return 2;
But I would like to be able to return two different numbers for example 2 and 3. Is there any way that I can do this in C#?
c#
This question already has an answer here:
How can I return multiple values from a function in C#?
26 answers
I have a method like this:
private double GetHeight()
return 2;
But I would like to be able to return two different numbers for example 2 and 3. Is there any way that I can do this in C#?
This question already has an answer here:
How can I return multiple values from a function in C#?
26 answers
c#
c#
edited 16 hours ago
Michał Turczyn
16.2k132241
16.2k132241
asked 16 hours ago
Alan2Alan2
1,71856139278
1,71856139278
marked as duplicate by Mormegil, Soner Gönül
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
13 hours ago
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Mormegil, Soner Gönül
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
13 hours ago
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
return array if you need more values
– Shubham
16 hours ago
1
This probably is exactly what you need
– Jordi
16 hours ago
2
for clarity: does your method always return the same number of return values (each with specific semantic meaning) - or is the number of return values dynamic, i.e. sometimes it'll be 1 (or maybe even zero), and other times it might be 20? It matters a lot. For the fixed number scenario: any of the tuple-ish answers are good; for the dynamic scenario: the array/list approaches are good.
– Marc Gravell♦
16 hours ago
How does this question have so many upvotes? The question lacks a significant amount of effort and a simple search on the internet would've provided the answer stackoverflow.com/help/how-to-ask
– Denny
12 hours ago
add a comment |
return array if you need more values
– Shubham
16 hours ago
1
This probably is exactly what you need
– Jordi
16 hours ago
2
for clarity: does your method always return the same number of return values (each with specific semantic meaning) - or is the number of return values dynamic, i.e. sometimes it'll be 1 (or maybe even zero), and other times it might be 20? It matters a lot. For the fixed number scenario: any of the tuple-ish answers are good; for the dynamic scenario: the array/list approaches are good.
– Marc Gravell♦
16 hours ago
How does this question have so many upvotes? The question lacks a significant amount of effort and a simple search on the internet would've provided the answer stackoverflow.com/help/how-to-ask
– Denny
12 hours ago
return array if you need more values
– Shubham
16 hours ago
return array if you need more values
– Shubham
16 hours ago
1
1
This probably is exactly what you need
– Jordi
16 hours ago
This probably is exactly what you need
– Jordi
16 hours ago
2
2
for clarity: does your method always return the same number of return values (each with specific semantic meaning) - or is the number of return values dynamic, i.e. sometimes it'll be 1 (or maybe even zero), and other times it might be 20? It matters a lot. For the fixed number scenario: any of the tuple-ish answers are good; for the dynamic scenario: the array/list approaches are good.
– Marc Gravell♦
16 hours ago
for clarity: does your method always return the same number of return values (each with specific semantic meaning) - or is the number of return values dynamic, i.e. sometimes it'll be 1 (or maybe even zero), and other times it might be 20? It matters a lot. For the fixed number scenario: any of the tuple-ish answers are good; for the dynamic scenario: the array/list approaches are good.
– Marc Gravell♦
16 hours ago
How does this question have so many upvotes? The question lacks a significant amount of effort and a simple search on the internet would've provided the answer stackoverflow.com/help/how-to-ask
– Denny
12 hours ago
How does this question have so many upvotes? The question lacks a significant amount of effort and a simple search on the internet would've provided the answer stackoverflow.com/help/how-to-ask
– Denny
12 hours ago
add a comment |
5 Answers
5
active
oldest
votes
Yes ValueTuple
/ Named Tuple (available in C# 7.1). The advantage is its the most succinct, its immutable, and its easy to construct.
The ValueTuple struct has fields named Item1, Item2, Item3, and so on,
similar to the properties defined in the existing Tuple types.
However, when you initialize a tuple, you can use new language
features that give better names to each field. Doing so creates a
named tuple. Named tuples still have elements named Item1, Item2,
Item3 and so on. But they also have synonyms for any of those elements
that you have named. You create a named tuple by specifying the names
for each element.
private (double first, double second) GetHeight()
return (1,2);
...
var result = ViaNamedValueTuple();
Console.WriteLine($"result.first, result.second");
var (first, second) = ViaNamedValueTuple();
Console.WriteLine($"first, second");
Classic Tuple
C# tuple type
The .NET Framework already has generic Tuple classes. These classes,
however, had two major limitations. For one, the Tuple classes named
their properties Item1, Item2, and so on. Those names carry no
semantic information. Using these Tuple types does not enable
communicating the meaning of each of the properties. The new language
features enable you to declare and use semantically meaningful names
for the elements in a tuple.
public Tuple<int, int> ViaClassicTuple()
return new Tuple<int, int>(1,2);
...
var tuple = ViaClassicTuple();
Console.WriteLine($"tuple.Item1, tuple.Item2");
Classic struct
struct (C# Reference)
A struct type is a value type that is typically used to encapsulate
small groups of related variables, such as the coordinates of a
rectangle or the characteristics of an item in an inventory.
public struct ClassicStruct
public int First get; set;
public int Second get; set;
public ClassicStruct(int first, int second)
First = first;
Second = second;
...
public ClassicStruct ViaClassicStruct()
return new ClassicStruct(1, 2);
...
var classicStruct = ViaClassicStruct();
Console.WriteLine($"classicStruct.First, classicStruct.Second");
Readonly struct
readonly (C# Reference)
The readonly modifier on a struct definition declares that the struct
is immutable. Every instance field of the struct must be marked
readonly, as shown in the following example:
public readonly struct ReadonlyStruct
public int First get;
public int Second get;
public ReadonlyStruct(int first, int second)
First = first;
Second = second;
...
public ReadonlyStruct ViaReadonlyStruct()
return new ReadonlyStruct(1, 2);
...
var readonlyStruct = ViaReadonlyStruct();
Console.WriteLine($"readonlyStruct.First, readonlyStruct.Second");
Simple Class
Classes (C# Programming Guide)
A type that is defined as a class is a reference type. At run time,
when you declare a variable of a reference type, the variable contains
the value null until you explicitly create an instance of the class by
using the new operator, or assign it an object of a compatible type
that may have been created elsewhere
public class SomeClass
public int First get; set;
public int Second get; set;
public SomeClass(int first, int second)
First = first;
Second = second;
...
public SomeClass ViaSomeClass()
return new SomeClass(1, 2);
...
var someClass = ViaSomeClass();
Console.WriteLine($"someClass.First, someClass.Second");
Out parameters
out parameter modifier (C# Reference)
The out keyword causes arguments to be passed by reference. It makes
the formal parameter an alias for the argument, which must be a
variable. In other words, any operation on the parameter is made on
the argument. It is like the ref keyword, except that ref requires
that the variable be initialized before it is passed. It is also like
the in keyword, except that in does not allow the called method to
modify the argument value. To use an out parameter, both the method
definition and the calling method must explicitly use the out keyword.
public bool ViaOutParams(out int first, out int second)
first = 1;
second = 2;
return someCondition;
...
if(ViaOutParams(out var firstInt, out var secondInt))
Console.WriteLine($"firstInt, secondInt");
Out Value Tuple
public bool ViaOutTuple(out (int first,int second) output)
output = (1, 2);
return someCondition;
...
if (ViaOutTuple(out var output))
Console.WriteLine($"output.first, output.second");
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
add a comment |
Multiple ways:
out
parameters:private double GetHeight(out int anotherValue)
anotherValue = 42;
return 2;value-tuples:
private (double height, int anotherValue) GetHeight()
return (42, 2);(warning: value-tuples have known problems if used in .NET Standard libraries, as the assembly bindings from .NET Standard to .NET Framework are ... kinda fubar)
custom return types:
private Something GetHeight()
return new Something(42, 2);(to avoid allocations, you may wish to define
Something
as areadonly struct
in this scenario)
add a comment |
Yes, you can use Tuple:
class Program
static void Main(string[] args)
Tuple<int, int> height = GetHeight();
Console.WriteLine(height.Item1 + " - " + height.Item2);
Console.ReadLine();
private static Tuple<int, int> GetHeight()
return new Tuple<int, int>(2, 3);
OUTPUT:
2 - 3
add a comment |
Also you could use out
parameters:
static void Main(string[] args)
int i, j;
GetHeight(out i, out j);
public static void GetHeight(out int i1, out int i2)
i1 = 1;
i2 = 2;
add a comment |
Make a int array.Or another way is to create class.
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... areadonly struct
would be fine
– Marc Gravell♦
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
|
show 5 more comments
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
Yes ValueTuple
/ Named Tuple (available in C# 7.1). The advantage is its the most succinct, its immutable, and its easy to construct.
The ValueTuple struct has fields named Item1, Item2, Item3, and so on,
similar to the properties defined in the existing Tuple types.
However, when you initialize a tuple, you can use new language
features that give better names to each field. Doing so creates a
named tuple. Named tuples still have elements named Item1, Item2,
Item3 and so on. But they also have synonyms for any of those elements
that you have named. You create a named tuple by specifying the names
for each element.
private (double first, double second) GetHeight()
return (1,2);
...
var result = ViaNamedValueTuple();
Console.WriteLine($"result.first, result.second");
var (first, second) = ViaNamedValueTuple();
Console.WriteLine($"first, second");
Classic Tuple
C# tuple type
The .NET Framework already has generic Tuple classes. These classes,
however, had two major limitations. For one, the Tuple classes named
their properties Item1, Item2, and so on. Those names carry no
semantic information. Using these Tuple types does not enable
communicating the meaning of each of the properties. The new language
features enable you to declare and use semantically meaningful names
for the elements in a tuple.
public Tuple<int, int> ViaClassicTuple()
return new Tuple<int, int>(1,2);
...
var tuple = ViaClassicTuple();
Console.WriteLine($"tuple.Item1, tuple.Item2");
Classic struct
struct (C# Reference)
A struct type is a value type that is typically used to encapsulate
small groups of related variables, such as the coordinates of a
rectangle or the characteristics of an item in an inventory.
public struct ClassicStruct
public int First get; set;
public int Second get; set;
public ClassicStruct(int first, int second)
First = first;
Second = second;
...
public ClassicStruct ViaClassicStruct()
return new ClassicStruct(1, 2);
...
var classicStruct = ViaClassicStruct();
Console.WriteLine($"classicStruct.First, classicStruct.Second");
Readonly struct
readonly (C# Reference)
The readonly modifier on a struct definition declares that the struct
is immutable. Every instance field of the struct must be marked
readonly, as shown in the following example:
public readonly struct ReadonlyStruct
public int First get;
public int Second get;
public ReadonlyStruct(int first, int second)
First = first;
Second = second;
...
public ReadonlyStruct ViaReadonlyStruct()
return new ReadonlyStruct(1, 2);
...
var readonlyStruct = ViaReadonlyStruct();
Console.WriteLine($"readonlyStruct.First, readonlyStruct.Second");
Simple Class
Classes (C# Programming Guide)
A type that is defined as a class is a reference type. At run time,
when you declare a variable of a reference type, the variable contains
the value null until you explicitly create an instance of the class by
using the new operator, or assign it an object of a compatible type
that may have been created elsewhere
public class SomeClass
public int First get; set;
public int Second get; set;
public SomeClass(int first, int second)
First = first;
Second = second;
...
public SomeClass ViaSomeClass()
return new SomeClass(1, 2);
...
var someClass = ViaSomeClass();
Console.WriteLine($"someClass.First, someClass.Second");
Out parameters
out parameter modifier (C# Reference)
The out keyword causes arguments to be passed by reference. It makes
the formal parameter an alias for the argument, which must be a
variable. In other words, any operation on the parameter is made on
the argument. It is like the ref keyword, except that ref requires
that the variable be initialized before it is passed. It is also like
the in keyword, except that in does not allow the called method to
modify the argument value. To use an out parameter, both the method
definition and the calling method must explicitly use the out keyword.
public bool ViaOutParams(out int first, out int second)
first = 1;
second = 2;
return someCondition;
...
if(ViaOutParams(out var firstInt, out var secondInt))
Console.WriteLine($"firstInt, secondInt");
Out Value Tuple
public bool ViaOutTuple(out (int first,int second) output)
output = (1, 2);
return someCondition;
...
if (ViaOutTuple(out var output))
Console.WriteLine($"output.first, output.second");
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
add a comment |
Yes ValueTuple
/ Named Tuple (available in C# 7.1). The advantage is its the most succinct, its immutable, and its easy to construct.
The ValueTuple struct has fields named Item1, Item2, Item3, and so on,
similar to the properties defined in the existing Tuple types.
However, when you initialize a tuple, you can use new language
features that give better names to each field. Doing so creates a
named tuple. Named tuples still have elements named Item1, Item2,
Item3 and so on. But they also have synonyms for any of those elements
that you have named. You create a named tuple by specifying the names
for each element.
private (double first, double second) GetHeight()
return (1,2);
...
var result = ViaNamedValueTuple();
Console.WriteLine($"result.first, result.second");
var (first, second) = ViaNamedValueTuple();
Console.WriteLine($"first, second");
Classic Tuple
C# tuple type
The .NET Framework already has generic Tuple classes. These classes,
however, had two major limitations. For one, the Tuple classes named
their properties Item1, Item2, and so on. Those names carry no
semantic information. Using these Tuple types does not enable
communicating the meaning of each of the properties. The new language
features enable you to declare and use semantically meaningful names
for the elements in a tuple.
public Tuple<int, int> ViaClassicTuple()
return new Tuple<int, int>(1,2);
...
var tuple = ViaClassicTuple();
Console.WriteLine($"tuple.Item1, tuple.Item2");
Classic struct
struct (C# Reference)
A struct type is a value type that is typically used to encapsulate
small groups of related variables, such as the coordinates of a
rectangle or the characteristics of an item in an inventory.
public struct ClassicStruct
public int First get; set;
public int Second get; set;
public ClassicStruct(int first, int second)
First = first;
Second = second;
...
public ClassicStruct ViaClassicStruct()
return new ClassicStruct(1, 2);
...
var classicStruct = ViaClassicStruct();
Console.WriteLine($"classicStruct.First, classicStruct.Second");
Readonly struct
readonly (C# Reference)
The readonly modifier on a struct definition declares that the struct
is immutable. Every instance field of the struct must be marked
readonly, as shown in the following example:
public readonly struct ReadonlyStruct
public int First get;
public int Second get;
public ReadonlyStruct(int first, int second)
First = first;
Second = second;
...
public ReadonlyStruct ViaReadonlyStruct()
return new ReadonlyStruct(1, 2);
...
var readonlyStruct = ViaReadonlyStruct();
Console.WriteLine($"readonlyStruct.First, readonlyStruct.Second");
Simple Class
Classes (C# Programming Guide)
A type that is defined as a class is a reference type. At run time,
when you declare a variable of a reference type, the variable contains
the value null until you explicitly create an instance of the class by
using the new operator, or assign it an object of a compatible type
that may have been created elsewhere
public class SomeClass
public int First get; set;
public int Second get; set;
public SomeClass(int first, int second)
First = first;
Second = second;
...
public SomeClass ViaSomeClass()
return new SomeClass(1, 2);
...
var someClass = ViaSomeClass();
Console.WriteLine($"someClass.First, someClass.Second");
Out parameters
out parameter modifier (C# Reference)
The out keyword causes arguments to be passed by reference. It makes
the formal parameter an alias for the argument, which must be a
variable. In other words, any operation on the parameter is made on
the argument. It is like the ref keyword, except that ref requires
that the variable be initialized before it is passed. It is also like
the in keyword, except that in does not allow the called method to
modify the argument value. To use an out parameter, both the method
definition and the calling method must explicitly use the out keyword.
public bool ViaOutParams(out int first, out int second)
first = 1;
second = 2;
return someCondition;
...
if(ViaOutParams(out var firstInt, out var secondInt))
Console.WriteLine($"firstInt, secondInt");
Out Value Tuple
public bool ViaOutTuple(out (int first,int second) output)
output = (1, 2);
return someCondition;
...
if (ViaOutTuple(out var output))
Console.WriteLine($"output.first, output.second");
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
add a comment |
Yes ValueTuple
/ Named Tuple (available in C# 7.1). The advantage is its the most succinct, its immutable, and its easy to construct.
The ValueTuple struct has fields named Item1, Item2, Item3, and so on,
similar to the properties defined in the existing Tuple types.
However, when you initialize a tuple, you can use new language
features that give better names to each field. Doing so creates a
named tuple. Named tuples still have elements named Item1, Item2,
Item3 and so on. But they also have synonyms for any of those elements
that you have named. You create a named tuple by specifying the names
for each element.
private (double first, double second) GetHeight()
return (1,2);
...
var result = ViaNamedValueTuple();
Console.WriteLine($"result.first, result.second");
var (first, second) = ViaNamedValueTuple();
Console.WriteLine($"first, second");
Classic Tuple
C# tuple type
The .NET Framework already has generic Tuple classes. These classes,
however, had two major limitations. For one, the Tuple classes named
their properties Item1, Item2, and so on. Those names carry no
semantic information. Using these Tuple types does not enable
communicating the meaning of each of the properties. The new language
features enable you to declare and use semantically meaningful names
for the elements in a tuple.
public Tuple<int, int> ViaClassicTuple()
return new Tuple<int, int>(1,2);
...
var tuple = ViaClassicTuple();
Console.WriteLine($"tuple.Item1, tuple.Item2");
Classic struct
struct (C# Reference)
A struct type is a value type that is typically used to encapsulate
small groups of related variables, such as the coordinates of a
rectangle or the characteristics of an item in an inventory.
public struct ClassicStruct
public int First get; set;
public int Second get; set;
public ClassicStruct(int first, int second)
First = first;
Second = second;
...
public ClassicStruct ViaClassicStruct()
return new ClassicStruct(1, 2);
...
var classicStruct = ViaClassicStruct();
Console.WriteLine($"classicStruct.First, classicStruct.Second");
Readonly struct
readonly (C# Reference)
The readonly modifier on a struct definition declares that the struct
is immutable. Every instance field of the struct must be marked
readonly, as shown in the following example:
public readonly struct ReadonlyStruct
public int First get;
public int Second get;
public ReadonlyStruct(int first, int second)
First = first;
Second = second;
...
public ReadonlyStruct ViaReadonlyStruct()
return new ReadonlyStruct(1, 2);
...
var readonlyStruct = ViaReadonlyStruct();
Console.WriteLine($"readonlyStruct.First, readonlyStruct.Second");
Simple Class
Classes (C# Programming Guide)
A type that is defined as a class is a reference type. At run time,
when you declare a variable of a reference type, the variable contains
the value null until you explicitly create an instance of the class by
using the new operator, or assign it an object of a compatible type
that may have been created elsewhere
public class SomeClass
public int First get; set;
public int Second get; set;
public SomeClass(int first, int second)
First = first;
Second = second;
...
public SomeClass ViaSomeClass()
return new SomeClass(1, 2);
...
var someClass = ViaSomeClass();
Console.WriteLine($"someClass.First, someClass.Second");
Out parameters
out parameter modifier (C# Reference)
The out keyword causes arguments to be passed by reference. It makes
the formal parameter an alias for the argument, which must be a
variable. In other words, any operation on the parameter is made on
the argument. It is like the ref keyword, except that ref requires
that the variable be initialized before it is passed. It is also like
the in keyword, except that in does not allow the called method to
modify the argument value. To use an out parameter, both the method
definition and the calling method must explicitly use the out keyword.
public bool ViaOutParams(out int first, out int second)
first = 1;
second = 2;
return someCondition;
...
if(ViaOutParams(out var firstInt, out var secondInt))
Console.WriteLine($"firstInt, secondInt");
Out Value Tuple
public bool ViaOutTuple(out (int first,int second) output)
output = (1, 2);
return someCondition;
...
if (ViaOutTuple(out var output))
Console.WriteLine($"output.first, output.second");
Yes ValueTuple
/ Named Tuple (available in C# 7.1). The advantage is its the most succinct, its immutable, and its easy to construct.
The ValueTuple struct has fields named Item1, Item2, Item3, and so on,
similar to the properties defined in the existing Tuple types.
However, when you initialize a tuple, you can use new language
features that give better names to each field. Doing so creates a
named tuple. Named tuples still have elements named Item1, Item2,
Item3 and so on. But they also have synonyms for any of those elements
that you have named. You create a named tuple by specifying the names
for each element.
private (double first, double second) GetHeight()
return (1,2);
...
var result = ViaNamedValueTuple();
Console.WriteLine($"result.first, result.second");
var (first, second) = ViaNamedValueTuple();
Console.WriteLine($"first, second");
Classic Tuple
C# tuple type
The .NET Framework already has generic Tuple classes. These classes,
however, had two major limitations. For one, the Tuple classes named
their properties Item1, Item2, and so on. Those names carry no
semantic information. Using these Tuple types does not enable
communicating the meaning of each of the properties. The new language
features enable you to declare and use semantically meaningful names
for the elements in a tuple.
public Tuple<int, int> ViaClassicTuple()
return new Tuple<int, int>(1,2);
...
var tuple = ViaClassicTuple();
Console.WriteLine($"tuple.Item1, tuple.Item2");
Classic struct
struct (C# Reference)
A struct type is a value type that is typically used to encapsulate
small groups of related variables, such as the coordinates of a
rectangle or the characteristics of an item in an inventory.
public struct ClassicStruct
public int First get; set;
public int Second get; set;
public ClassicStruct(int first, int second)
First = first;
Second = second;
...
public ClassicStruct ViaClassicStruct()
return new ClassicStruct(1, 2);
...
var classicStruct = ViaClassicStruct();
Console.WriteLine($"classicStruct.First, classicStruct.Second");
Readonly struct
readonly (C# Reference)
The readonly modifier on a struct definition declares that the struct
is immutable. Every instance field of the struct must be marked
readonly, as shown in the following example:
public readonly struct ReadonlyStruct
public int First get;
public int Second get;
public ReadonlyStruct(int first, int second)
First = first;
Second = second;
...
public ReadonlyStruct ViaReadonlyStruct()
return new ReadonlyStruct(1, 2);
...
var readonlyStruct = ViaReadonlyStruct();
Console.WriteLine($"readonlyStruct.First, readonlyStruct.Second");
Simple Class
Classes (C# Programming Guide)
A type that is defined as a class is a reference type. At run time,
when you declare a variable of a reference type, the variable contains
the value null until you explicitly create an instance of the class by
using the new operator, or assign it an object of a compatible type
that may have been created elsewhere
public class SomeClass
public int First get; set;
public int Second get; set;
public SomeClass(int first, int second)
First = first;
Second = second;
...
public SomeClass ViaSomeClass()
return new SomeClass(1, 2);
...
var someClass = ViaSomeClass();
Console.WriteLine($"someClass.First, someClass.Second");
Out parameters
out parameter modifier (C# Reference)
The out keyword causes arguments to be passed by reference. It makes
the formal parameter an alias for the argument, which must be a
variable. In other words, any operation on the parameter is made on
the argument. It is like the ref keyword, except that ref requires
that the variable be initialized before it is passed. It is also like
the in keyword, except that in does not allow the called method to
modify the argument value. To use an out parameter, both the method
definition and the calling method must explicitly use the out keyword.
public bool ViaOutParams(out int first, out int second)
first = 1;
second = 2;
return someCondition;
...
if(ViaOutParams(out var firstInt, out var secondInt))
Console.WriteLine($"firstInt, secondInt");
Out Value Tuple
public bool ViaOutTuple(out (int first,int second) output)
output = (1, 2);
return someCondition;
...
if (ViaOutTuple(out var output))
Console.WriteLine($"output.first, output.second");
edited 13 hours ago
answered 16 hours ago
Michael RandallMichael Randall
37.4k84372
37.4k84372
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
add a comment |
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
Note: Available in C# 7.0 +.
– Adriani6
16 hours ago
add a comment |
Multiple ways:
out
parameters:private double GetHeight(out int anotherValue)
anotherValue = 42;
return 2;value-tuples:
private (double height, int anotherValue) GetHeight()
return (42, 2);(warning: value-tuples have known problems if used in .NET Standard libraries, as the assembly bindings from .NET Standard to .NET Framework are ... kinda fubar)
custom return types:
private Something GetHeight()
return new Something(42, 2);(to avoid allocations, you may wish to define
Something
as areadonly struct
in this scenario)
add a comment |
Multiple ways:
out
parameters:private double GetHeight(out int anotherValue)
anotherValue = 42;
return 2;value-tuples:
private (double height, int anotherValue) GetHeight()
return (42, 2);(warning: value-tuples have known problems if used in .NET Standard libraries, as the assembly bindings from .NET Standard to .NET Framework are ... kinda fubar)
custom return types:
private Something GetHeight()
return new Something(42, 2);(to avoid allocations, you may wish to define
Something
as areadonly struct
in this scenario)
add a comment |
Multiple ways:
out
parameters:private double GetHeight(out int anotherValue)
anotherValue = 42;
return 2;value-tuples:
private (double height, int anotherValue) GetHeight()
return (42, 2);(warning: value-tuples have known problems if used in .NET Standard libraries, as the assembly bindings from .NET Standard to .NET Framework are ... kinda fubar)
custom return types:
private Something GetHeight()
return new Something(42, 2);(to avoid allocations, you may wish to define
Something
as areadonly struct
in this scenario)
Multiple ways:
out
parameters:private double GetHeight(out int anotherValue)
anotherValue = 42;
return 2;value-tuples:
private (double height, int anotherValue) GetHeight()
return (42, 2);(warning: value-tuples have known problems if used in .NET Standard libraries, as the assembly bindings from .NET Standard to .NET Framework are ... kinda fubar)
custom return types:
private Something GetHeight()
return new Something(42, 2);(to avoid allocations, you may wish to define
Something
as areadonly struct
in this scenario)
edited 15 hours ago
Toby Speight
17.5k134469
17.5k134469
answered 16 hours ago
Marc Gravell♦Marc Gravell
794k19821612566
794k19821612566
add a comment |
add a comment |
Yes, you can use Tuple:
class Program
static void Main(string[] args)
Tuple<int, int> height = GetHeight();
Console.WriteLine(height.Item1 + " - " + height.Item2);
Console.ReadLine();
private static Tuple<int, int> GetHeight()
return new Tuple<int, int>(2, 3);
OUTPUT:
2 - 3
add a comment |
Yes, you can use Tuple:
class Program
static void Main(string[] args)
Tuple<int, int> height = GetHeight();
Console.WriteLine(height.Item1 + " - " + height.Item2);
Console.ReadLine();
private static Tuple<int, int> GetHeight()
return new Tuple<int, int>(2, 3);
OUTPUT:
2 - 3
add a comment |
Yes, you can use Tuple:
class Program
static void Main(string[] args)
Tuple<int, int> height = GetHeight();
Console.WriteLine(height.Item1 + " - " + height.Item2);
Console.ReadLine();
private static Tuple<int, int> GetHeight()
return new Tuple<int, int>(2, 3);
OUTPUT:
2 - 3
Yes, you can use Tuple:
class Program
static void Main(string[] args)
Tuple<int, int> height = GetHeight();
Console.WriteLine(height.Item1 + " - " + height.Item2);
Console.ReadLine();
private static Tuple<int, int> GetHeight()
return new Tuple<int, int>(2, 3);
OUTPUT:
2 - 3
answered 16 hours ago
JoKeRxbLaCkJoKeRxbLaCk
567218
567218
add a comment |
add a comment |
Also you could use out
parameters:
static void Main(string[] args)
int i, j;
GetHeight(out i, out j);
public static void GetHeight(out int i1, out int i2)
i1 = 1;
i2 = 2;
add a comment |
Also you could use out
parameters:
static void Main(string[] args)
int i, j;
GetHeight(out i, out j);
public static void GetHeight(out int i1, out int i2)
i1 = 1;
i2 = 2;
add a comment |
Also you could use out
parameters:
static void Main(string[] args)
int i, j;
GetHeight(out i, out j);
public static void GetHeight(out int i1, out int i2)
i1 = 1;
i2 = 2;
Also you could use out
parameters:
static void Main(string[] args)
int i, j;
GetHeight(out i, out j);
public static void GetHeight(out int i1, out int i2)
i1 = 1;
i2 = 2;
answered 16 hours ago
Michał TurczynMichał Turczyn
16.2k132241
16.2k132241
add a comment |
add a comment |
Make a int array.Or another way is to create class.
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... areadonly struct
would be fine
– Marc Gravell♦
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
|
show 5 more comments
Make a int array.Or another way is to create class.
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... areadonly struct
would be fine
– Marc Gravell♦
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
|
show 5 more comments
Make a int array.Or another way is to create class.
Make a int array.Or another way is to create class.
edited 16 hours ago
answered 16 hours ago
Vuk UskokovicVuk Uskokovic
599
599
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... areadonly struct
would be fine
– Marc Gravell♦
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
|
show 5 more comments
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... areadonly struct
would be fine
– Marc Gravell♦
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... a
readonly struct
would be fine– Marc Gravell♦
16 hours ago
an array is definitely a bad way here - that's pretty allocatey and the semantic meaning of each value is unclear; creating a class would also be relatively allocatey, but... a
readonly struct
would be fine– Marc Gravell♦
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
Its not bad but its not needed in current question.
– Vuk Uskokovic
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
I'd rather have a class of strongly typed values that mean something rather than guessing how many are in the array and what their values represent
– Jonesopolis
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
You can make a list too.
– Vuk Uskokovic
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
@VukUskokovic that (list) has all the problems that arrays have, plus an extra object and layer of abstraction; making it a list just exacerbates the problem unless we are semantically returning a list of something
– Marc Gravell♦
16 hours ago
|
show 5 more comments
return array if you need more values
– Shubham
16 hours ago
1
This probably is exactly what you need
– Jordi
16 hours ago
2
for clarity: does your method always return the same number of return values (each with specific semantic meaning) - or is the number of return values dynamic, i.e. sometimes it'll be 1 (or maybe even zero), and other times it might be 20? It matters a lot. For the fixed number scenario: any of the tuple-ish answers are good; for the dynamic scenario: the array/list approaches are good.
– Marc Gravell♦
16 hours ago
How does this question have so many upvotes? The question lacks a significant amount of effort and a simple search on the internet would've provided the answer stackoverflow.com/help/how-to-ask
– Denny
12 hours ago