各位大大您們好∶
小弟我之前都寫C++,近日開始改寫C#,也順應時代潮流~
在C++里面,我很習慣指標的操作
我現在的目的,是有很多 class 實體化的 obj,假設叫做 obj1 ~ obj5 好了
每個 obj 里面,都有一個 struct (因為都是同一個 class 實體化出來的,當然都一樣的 struct)
我希望外部有個指標,可以切換對應到這5個 struct,進行操作
當然我知道其實要完成這目的,有其他作法,我現在只是在探尋,語法的不同?
我寫了2段 C++ 與 C# 的代碼,我原本以為是一樣的意思,結果執行出來卻不同
請問我該怎么修改 C# 部份?
謝謝大家~~ <(_ _)>
//創造‘點1’
POINT p1 = {0, 0} ;
//創造一個‘指標’,指向‘點1’
POINT* ptr = &p1 ;
//‘點1’,修改其值
p1.x = 1;
p1.y = 1;
//把‘指標’的值取出來給‘點2’
POINT p2 = *ptr ;
//輸出‘點1’、‘點2’的值
ShowMessage( String(p1.x) + " , " + String(p1.y) ) ;
ShowMessage( String(p2.x) + " , " + String(p2.y) ) ;
/********************************************
輸出結果:
p1 = 1, 1
p2 = 1, 1
********************************************/
//創造‘點1’
Point p1 = new Point(0,0);
//創造一個‘指標’,指向‘點1’
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(p1));
Marshal.StructureToPtr(p1, ptr, false);
//‘點1’,修改其值
p1.X = 1;
p1.Y = 1;
//把‘指標’的值取出來給‘點2’
Point p2 = (Point)Marshal.PtrToStructure(ptr, typeof(Point));
//輸出‘點1’、‘點2’的值
Console.WriteLine(p1.X.ToString() + " , " + p1.Y.ToString());
Console.WriteLine(p2.X.ToString() + " , " + p2.Y.ToString());
/********************************************
輸出結果:
p1 = 1, 1
p2 = 0, 0
********************************************//
uj5u.com熱心網友回復:
C# unsafe可以直接使用指標面向物件了,指標這些都不大用了,struct好像是值型別的
uj5u.com熱心網友回復:
C#這份代碼中的Point是結構體還是類?前者是值型別,后者是參考型別,結果會不一樣的.uj5u.com熱心網友回復:
using System;
namespace DifferentBetweenStructAndClass
{
//https://bbs.csdn.net/topics/399055308?page=1#post-414144690
class Program
{
static void Main(string[] args)
{
//第一種,如果使用類.
PointClass p1 =new PointClass(){X = 0,Y=0};
PointClass p2 = p1;
p1.X = 1;
p1.Y = 1;
Console.WriteLine($"p1.X:{p1.X},p1.Y:{p1.Y}");
Console.WriteLine($"p2.X:{p2.X},p2.Y:{p2.Y}");
//第二種,如果使用結構體.
PointStruct p3 = new PointStruct() { X = 0, Y = 0 };
PointStruct p4 = p3;
p3.X = 1;
p3.Y = 1;
Console.WriteLine($"p3.X:{p3.X},p3.Y:{p3.Y}");
Console.WriteLine($"p4.X:{p4.X},p4.Y:{p4.Y}");
Console.ReadKey();
}
}
public class PointClass
{
public double X { get; set; }
public double Y { get; set; }
}
public struct PointStruct
{
public double X { get; set; }
public double Y { get; set; }
}
}
如上代碼,輸出為:
p1.X:1,p1.Y:1
p2.X:1,p2.Y:1
p3.X:1,p3.Y:1
p4.X:0,p4.Y:0
面試經常問的問題之一:類與結構體的異同.
uj5u.com熱心網友回復:
代碼已上傳:https://github.com/zhanggaolei001/DifferentBetweenStructAndClassuj5u.com熱心網友回復:
結構是值型別,不是類
謝謝您的回覆
其實我現在就是在研究,C#有沒有辦法像C++一樣直接進行類似地址的操作
類的話看來是可以(看官方說明,Marshal 處理的也都是 object,而不是值)
所以請問除了 unsafe 方法之外,好樣沒有其他辦法了?
uj5u.com熱心網友回復:
根本別想著用unsafe這個東西(如果必須要用,也得等其他知識都學透了再去用).
你可以這么認為,C#中,所有類實體的變數其實都是指標.比如學生類的實體,比如一個學生類變數名叫student_A,那如果另外一個學生變數student_B=student_A,那么其實這兩變數最終指向的是同一個實體,這個實體的任何屬性變化,通過這兩個變數拿到的都將是相同的.
uj5u.com熱心網友回復:
用C#其實你應該想辦法盡量忘記指標這個東西,用面向物件的思路去看世間萬物.uj5u.com熱心網友回復:
你要學會抽象,現在的這個思路完全是想干巴巴的把C++代碼翻譯過來,你應該先用偽代碼或者UML圖來描述你的邏輯,這個不管用啥語言都是一樣的,萬變不離其宗.uj5u.com熱心網友回復:
Span<char> s1 = stackalloc char[10];
s1[0] = 'a';
s1[1] = 'b';
ReadOnlySpan<char> s2 = "iamstring".AsSpan();
ReadOnlySpan<char> s3 = s2.Slice(3, 2);
或者Memory<T>
uj5u.com熱心網友回復:
你應該說一下你的應用場景,然后從面向物件的角度來考慮C#代碼轉載請註明出處,本文鏈接:https://www.uj5u.com/net/256124.html
標籤:C#
