--- layout: stdlib-reference --- # attribute [nonmutating] ## Description Marks a function or a property and subscript accessor as non-mutating. A non-mutating function receives the implicit this parameter as an in parameter, so mutations to members accessed from this argument will be prohibited by the compiler. ## Signature
[nonmutating]
## Remarks Member functions of a type are non-mutating by default, so this attribute is not necessary in most cases. However, the set accessor of a property or subscript is mutating by default, and you can use [nonmutating] to mark it as non-mutating. For example: ```csharp struct S { int* ptr_x; property x : int { get { return *ptr_x; } [nonmutating] set { *ptr_x = value; } } } uniform S s; // `s` is not mutable. void test() { s.x = 1; } // OK, because the `set` accessor is non-mutating. ``` In the above example, the property x reads and writes to a memory location pointed to by ptr_x. Therefore, the set accessor is not actually modifying any field of S, and does not need to take this as an inout parameter. Using [nonmutating] here on the set accessor will allow it to be called with a non-mutating value of S. ## See also [mutating].