背景:
今天接觸到使用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之間的關係是前後...