唯讀屬性的賦值

2021-06-26 13:58:31 字數 1665 閱讀 3940

背景:

今天接觸到使用smtp傳送郵件的**,其中一段是關於郵件新增附件的,**的內容如下:

// add time stamp information for the file.contentdisposition disposition = data.contentdisposition;disposition.creationdate = system.io.file.getcreationtime(file);

disposition.modificationdate = system.io.file.getlastwritetime(file);

disposition.readdate = system.io.file.getlastaccesstime(file);

// add the file attachment to this e-mail message.

message.attachments.add(data);

其中附件的contentdisposition屬性是個唯讀屬性,所以不能直接對其進行賦值。

我們看到**中的處理方式:把該唯讀屬性賦值給乙個同型別的變數,然後直接對變數進行操作,最後把附件新增到附件集合中。

那麼,對唯讀屬性賦予的變數進行屬性的修改,同時會改變data.contentdisposition的值嗎?

其實,深入想一下,**中粗體部分會使得disposition和data.contentdisposition具有同乙個引用。不論由誰對子屬性進行修改,都會影響最終的結果。

這樣做其實還有乙個好處: 就是不必每次都以data.contentdisposition.creationdate這樣的形式修改屬性值,而只要使用disposition.createdate這樣的形式。

下面我們用乙個小示例來模擬上面的情況

首先,我們建乙個類classa,它包含乙個唯讀屬性,我們通過上面的方式去改變它的值

/// /// 包含唯讀屬性的類

///

public class classa

/// /// 型別為自定義類的唯讀屬性

///

public classb readonlyb

}}

classb的定義:

/// /// 自定義類

///

public class classb

set

}}

測試**:

class program

else

console.readline();

}}

程式的執行結果:

assign before:

assign after:i am an instance of classb !

property2 and parent.readonlyb : the same!

總結:此種給唯讀屬性賦值的方法,只適用於唯讀屬性型別為引用型別(string型別除外),且有子屬性的屬性;

其實可以直接通過data.contentdisposition.creationdate =...的形式進行賦值,而不必採用上面的形式;

這裡說的給唯讀屬性賦值,不是直接給其賦值,而是通過設定其子屬性的方式改變該唯讀屬性。

怎麼實現唯讀屬性

方法一 物件私有化 usr bin env python coding utf 8 author jia shilin class person object def init self,x self.age 20 def get age self return self.age a person ...

JS 建立唯讀屬性

這種方式可以建立 偽 唯讀屬性。這並不是一種好方法,因為使用 函式 獲得唯讀的 屬性 不太符合一般的邏輯。represent a used car.constructor function car miles self.drive function miles get a protected odo...

屬性賦值方法的賦值順序

預設初始化 顯示初始化 構造器初始化 通過 物件.屬性 或 物件.方法 進行賦值 塊中進行賦值 提前宣告!能夠使用static修飾的屬性方法和 塊中的屬性賦值都是擁有最高優先順序,所以我接下來說的順序都是非靜態的 優先順序先後 用上面方法序號就行排序 1 2 5 3 4 這裡的2和5之間的關係是前後...