【碼農】從 Object-C 到 C#

    CSharp_ObjC

    最近手邊進行一項工程,要將 Object-C 的程式碼「移植」到 C# 的機器上。Object-C 是拿手的,但 C# 完全不熟啊~於是上網找了一些資料,練習嘗試設計一個小範例,用Object-C 與 C# 各寫了一份,體會其中的奧妙。

    範例是設計一個類別 iPhone4S,用實例與單例宣告為物件並賦予預設值。

    Object-C

    iPhone4S.h
    #import <Foundation/Foundation.h>

    @interface iPhone4S : NSObject

    @property (nonatomic,retain) NSString *simCode;

    + (instancetype)shareInstance;

    - (NSString *)doCallOut:(NSString *)phoneNumber;

    - (NSString *)handUp;

    - (NSString *)volumeChanged:(NSInteger)volumeVal;

    - (NSString *)doVibrate;

    - (NSString *)doSiri:(NSString *)speakCommand;

    @end

    iPhone4S.m
    #import "iPhone4S.h"

    @implementation iPhone4S

    static iPhone4S *theiPhone4s = nil;

    - (instancetype)init{
    self = [super init];
    if (self) {
    self.simCode = @"0000";
    }
    return self;
    }

    + (instancetype)shareInstance{
    @synchronized (theiPhone4s) {
    if (theiPhone4s == nil) {
    theiPhone4s = [[iPhone4S alloc] init];
    }
    else{
    NSLog(@"NOT NEW 新建iphone4S");
    }
    }
    return theiPhone4s;
    }


    - (NSString *)doCallOut:(NSString *)phoneNumber{
    NSLog(@"iOS打電話給%@",phoneNumber);
    return @"撥號中";

    }

    - (NSString *)handUp{
    NSLog(@"iOS將通話中電話結束");
    return @"結束通話";
    }

    - (NSString *)volumeChanged:(NSInteger)volumeVal{
    NSLog(@"iOS將音量調整為%li",(long)volumeVal);
    return @"完成調音量";
    }

    - (NSString *)doVibrate{
    NSLog(@"iOS將轉振動");
    return @"完成轉振動";
    }

    - (NSString *)doSiri:(NSString *)speakCommand{
    return [@"Siri說:" stringByAppendingString:speakCommand] ;
    }

    @end

    C#

    iPhone4S.cs
    using System; public class iPhone4S { #region 宣告變數名稱 public string simCode { set; get; } //姓名 #endregion private static readonly object locker = new object(); private static iPhone4S theiPhone4s = null; /* 使用 private 則禁止從外部產生實例,用於Singleton private iphone4S() { simcode = "0000"; Console.WriteLine("iphone4S 電話:" + phonenumber); } */ public iPhone4S() { simCode = "0000"; } public static iPhone4S shareInstance() { lock (locker) { if (theiPhone4s == null) { theiPhone4s = new iPhone4S(); } else { Console.WriteLine("NOT NEW 新建iphone4S"); } } return theiPhone4s; } public string doCallOut(string phoneNumber) { Console.WriteLine("iOS打電話給" + phoneNumber); return "撥號中"; } public string handUp() { Console.WriteLine("iOS將通話中電話結束"); return "結束通話"; } public string volumeChanged(int volumeVal) { Console.WriteLine("iOS將音量調整為" + volumeVal); return "完成調音量"; } public string doVibrate() { Console.WriteLine("iOS將轉振動"); return "完成轉振動"; } public string doSiri(string speakCommand) { return "Siri說:" + speakCommand; } }

    驗證:設計一個按鈕,print 結果

    Object-C

    -(IBAction)btnLogSimCode_Click:(id)sender{
    iPhone4S *myPhone = [[iPhone4S alloc] init];
    iPhone4S *companyPhone = [iPhone4S shareInstance];
    iPhone4S *companyPhone2 = [iPhone4S shareInstance];

    myPhone.simCode = @"1234";
    companyPhone2.simCode = @"5678";

    NSLog(@"myPhone 電話 Sim Code:%@" , myPhone.simCode);
    NSLog(@"companyPhone 電話 Sim Code:%@" , companyPhone.simCode);
    NSLog(@"companyPhone2 電話 Sim Code:%@" , companyPhone2.simCode);
    }

    結果輸出:
    [1742:111130] NOT NEW 新建iphone4S
    [1742:111130] myPhone 電話 Sim Code:1234
    [1742:111130] companyPhone 電話 Sim Code:5678
    [1742:111130] companyPhone2 電話 Sim Code:5678

    C#

    private void btnLogSimCode_Click(object sender, EventArgs e)
    {
    iPhone4S myPhone = new iPhone4S();
    iPhone4S companyPhone = iPhone4S.shareInstance();
    iPhone4S companyPhone2 = iPhone4S.shareInstance();

    myPhone.simCode = "1234";
    companyPhone2.simCode = "5678";

    Console.WriteLine("myPhone 電話 Sim Code:" + myPhone.simCode);
    Console.WriteLine("companyPhone 電話 Sim Code:" + companyPhone.simCode);
    Console.WriteLine("companyPhone2 電話 Sim Code:" + companyPhone2.simCode);
    }

    結果輸出:
    NOT NEW 新建iphone4S
    myPhone 電話 Sim Code:1234
    companyPhone 電話 Sim Code:5678
    companyPhone2 電話 Sim Code:5678

     

    其實數十種程式語言發展到現在,只要現在還在主流的,不管是哪一種,概念上都有共通和相同的部分。只是語法上的差異還真令人腦袋糾結,

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *