學習軌道
/
C#
C#
/
練習
/
建構遙測
建構遙測

建構遙測

學習練習

簡介

參數

這個練習會討論 C# 中方法參數的一些細節,以及它們的使用方式。

參數會將資訊從發出呼叫的方法傳遞給被呼叫的方法。

  • 參數的行為可以透過使用ref和out等修飾詞來修改。

  • 帶有out修飾詞的參數會將值從被呼叫的方法回傳給呼叫端。這個參數可以在未初始化的情況下傳遞給被呼叫的方法,而且無論如何,在被呼叫的方法內,它會被視為在進入方法時尚未初始化。要理解參數修飾詞的行為與規則,最容易的方式是透過範例(見下方)和編譯器訊息。

void Foo(out int val)
{
    val = 42;
}
void Bar(int val)
{
    val = 42;
}

int importantValue = 1729;
Foo(out importantValue);
var result = importantValue == 42;
// => true

importantValue = 1729;
Bar(importantValue);
result = importantValue == 1729;
// => true
  • out參數必須在被呼叫的方法內指定值。

  • 帶有ref修飾詞的參數會將值傳入被呼叫的方法。當方法回傳時,呼叫端會看到被呼叫的方法對該參數所做的任何更新。

void Foo(ref int val)
{
    val *= 7;
}

int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
  • ref參數必須是變數,因為被呼叫的方法會直接操作呼叫端所看到的參數。
  • out和ref修飾詞在被呼叫的方法簽章與呼叫位置都必須同時出現。

說明

你在classes練習中開始的遙控車專案進行得很順利(恭喜!),而且因為最近談成了幾筆贊助案,預算裡有經費可以做一些強化。

其中一部分預算被用來提供一些遙測資料。

為了讓贊助商開心,車上安裝了一面看板,在車子繞行賽道時顯示贊助商的名稱。

你會注意到,這些新奇技術的導入大幅縮短了車子的電池續航力。

1. 讓遙控車能顯示贊助商名稱

實作SetSponsors(),讓它接收一個或多個贊助商名稱,並儲存在車子上。

請注意,SetSponsors()方法的引數保證不會是 null。

實作DisplaySponsor()來顯示所選的贊助商。傳入的第一個贊助商,其sponsorNum為 0,第二個為 1,依此類推。

var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"

2. 取得車子的遙測資料

實作RemoteControlCar.GetTelemetryData()方法。

GetTelemetryData()應該透過out參數提供電池百分比,以及以公尺為單位的行駛距離。

GetTelemetryData()應該在 serialNum 引數小於先前收到的值時回傳false。(這牽涉到多個遙測節點的問題。)在這種情況下,serialNum會被設為先前最高的serialNum,而電池百分比和行駛公尺數都會被設為-1。呼叫成功時,serialNum維持不變。

var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
int serialNum = 4;
car.GetTelemetryData(ref serialNum, out int batteryPercentage, out int distanceDrivenInMeters);
// => true, 4L, 80, 4

serialNum = 1;
car.GetTelemetryData(ref serialNum, out batteryPercentage, out distanceDrivenInMeters);
// => false, 4L, -1, -1

3. 新增功能,讓遙測系統能取得每公尺的電池用量

實作TelemetryClient.GetBatteryUsagePerMeter()方法。

這會呼叫RemoteControlCar.GetTelemetryData()。如果GetTelemetryData()回傳false,或者車子尚未行駛過,這個常式就應該回傳 "no data"。如果GetTelemetryData()回傳true,則應該回傳格式如下的訊息:"usage-per-meter=BATTERY-USAGE-PER-METER",其中計算方式是把(100 減去目前的電池百分比)除以目前為止行駛的公尺數。

var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
var tc = new TelemetryClient(car);
int serialNum = 4;
tc.GetBatteryUsagePerMeter(serialNum);
// => "usage-per-meter=5"

serialNum = 1;
tc.GetBatteryUsagePerMeter(serialNum);
// => "no data"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
C# Exercism

準備好開始 建構遙測 了嗎?

註冊 Exercism,透過 62 個概念178 個練習 和真人引導來學習並精通 C#,全部免費。