parameters. overview a reminder why parameters are needed how parameters work value parameters...

35
Parameters

Upload: luke-bradley

Post on 01-Jan-2016

238 views

Category:

Documents


2 download

TRANSCRIPT

Parameters

Overview

• A Reminder

• Why Parameters are Needed

• How Parameters Work

• Value Parameters

• Reference Parameters

• Out Parameters

You’ve Seen ParametersDefined:

private void buttonAdd_Click(object sender, EventArgs e)private void FormMain_Load(object sender, EventArgs e)private void buttonAddDigit_Click(object sender, EventArgs e)

Invoked:

listBoxNames.Items.Add(textBoxInput.Text);

choice = MessageBox.Show("Do you want to exit the program?", "Quit?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

Parameters (A Reminder)• Functions cannot see each other’s variables

(scope)• Special variables used to “catch” data being

passed• This is the way functions have to

communicate with each other• Located between parentheses ( )• If no parameters are needed, leave the

parentheses empty

Why Do We Need Parameters

• Functions are good– Reuse– Modularity– Good design

• Scope is limited– A variable declared in a function is only visible

inside that function– Using global variables is a bad idea

• So we need a way of passing data between functions

Parameter Example• Defined:private static void DoSomething(int x, double y,

string name)

• Invoked:DoSomething(42, 3.14, “Bob Smith”);

• Notice above that there is a 1-1 matching, and the types must match too

Parameter Details• By default, all primitive types are

passed by value– Remember primitive types are all non-

class types (int, float, double, string, char, etc.)

– The function gets a copy of the variable– So if you change the variable in the

function, the original value in the caller will remain unchanged

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

The OutputThe value of i is 4The value of x is 6Now the value of i is 4

The variable “i” is not changed because the function gets a copy of the value.

Let’s see this traced out…

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 0i

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4

IBT 4x

The value in i is copiedinto the variable x

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4

IBT 6x

Wai

ting

here

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4The value of x is 6

IBT 6x

Wai

ting

here

By Value Examplepublic static void IncreaseByTwo(int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4The value of x is 6Now the value of i is 4

IBT 6x

Ref Parameters

• We can alter how parameters are handled using the “ref” keyword

• This makes the parameter a“By Reference” parameter

• Now the parameter IS NOT a copy of the value; it refers to the original

By Reference Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

The OutputThe value of i is 4The value of x is 6Now the value of i is 6

The variable “i” is changed because the function refers to the original variable i.

Let’s see this traced out…

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 0i

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

MEMORY

Main 4i

OUTPUTThe value of i is 4

IBT Rx

x is a reference to i

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

OUTPUTThe value of i is 4

Wai

ting

here

MEMORY

Main 6i

IBT Rx

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

OUTPUTThe value of i is 4The value of x is 6

Wai

ting

here

MEMORY

Main 6i

IBT Rx

By Ref Examplepublic static void IncreaseByTwo(ref int x){ x += 2; Console.WriteLine("The value of x is " + x);}

static void Main(string[] args){ int i; i = 4; Console.WriteLine("The value of i is " + i); IncreaseByTwo(ref i); Console.WriteLine("Now the value of i is " + i);}

OUTPUTThe value of i is 4The value of x is 6Now the value of i is 6

MEMORY

Main 6i

IBT Rx

The Necessity of Ref Parameters• What if a function needs to return a value

when it is complete?– Use the “return” statement and declare the

function of a particular type– Ex: public static int sum(int x, int y) { return x + y; }

• But what if the function should return more than one value?– Create a collection of values to return and return

the collection– Use ref (by reference) parameters to allow

multiple items to be updated/modified

Another By-Ref Example(notice we need to return three values, modifying their original values)

static public void RGBToGrey (ref byte red, ref byte green, ref byte blue)

{ byte average; average = (red + green + blue) / 3;

red = average; green = average; blue = average;}

Out Parameters• We’ve seen parameters that pass information

into a function (via copying the value)• We’ve seen parameters that pass information

into a function and receive information out of the function (via changed values to a reference)

• What about having values come out of a function?– No initial values passed in

Out Parameters

• Think of these similar to ref (by reference) parameters– No initial value passed in– It’s the job of the function to fill in a value

for this type of parameter– When the function ends, the calling

method will retain the value stored in the parameter

Out Parameter Examplepublic static void getUserInfo(out int age, out string name,

out double gpa){ Console.Write(“What is your name? "); name = Console.Read(); Console.Write(“What is your age? "); age = Int32.Parse(Console.Read()); Console.Write(“What is your GPA? "); gpa = Double.Parse(Console.Read());}

static void Main(string[] args){ int user_age; string user_name; double user_gpa;

getUserInfo(out user_age, out user_name, out user_gpa); // more code follows...}

Out Parameter Examplepublic static void getUserInfo(out int age, out string name,

out double gpa){ Console.Write(“What is your name? "); name = Console.Read(); Console.Write(“What is your age? "); age = Int32.Parse(Console.Read()); Console.Write(“What is your GPA? "); age = Double.Parse(Console.Read());}

static void Main(string[] args){ int user_age; string user_name; double user_gpa;

getUserInfo(out user_age, out user_name, out user_gpa); // more code follows...}

Out Parameters “Output” Information

• Notice in the preceding example, the “age”, “name” and “gpa” variables must be filled in with values within the funtion

• After this is done, the calling method (Main) can make use of these values via the “user_age”, “user_name” and “user_gpa” variables

• How is this different from ref (by-reference) parameters?– Notice we couldn’t make use of these parameters (read their

values) until we placed some value into them– So the statementConsole.WriteLine("The user’s age is" + age);at the beginning of the function (first line of the function) would be illegal because this parameter does not have a value assigned to it yet

The Necessity of Out Parameters• Like “ref” parameters, “out” parameters are useful for

returning information out from the function• Unlike “ref” parameters, “out” parameters don’t

receive values from the caller– No values passed in – the parameters are “empty”

• Use “out” parameters when the function is generating the values and returning them to the calling method– Just use the function return type and the “return” statement

if the function returns only one value– Use “out” parameters when more than one value is to be

generated and returned to the calling method

Conclusion• You should have a better/stronger feel on

how parameters work• You should understand the difference

between by-value, by-reference, and out parameters

• Given a section of code, you should be able to “trace through” what the computer would do (and what output would be generated)