# GrainState&lt;T&gt; Properties

[Type overview](/orleans/docs/api/csharp/microsoft.orleans.core/orleans.grainstate-1/)

## ETag {#etag-8bd135fe}

[Dedicated page](/orleans/docs/api/csharp/microsoft.orleans.core/orleans.grainstate-1/properties/etag-8bd135fe/)

[Source](https://github.com/dotnet/orleans/blob/e4e752cedecc2976811db49802c7a999b1f1c704/src/Orleans.Core/CodeGeneration/IGrainState.cs)

```csharp
[Orleans.Id(1)]
public string ETag
```

Gets or sets the ETag that allows optimistic concurrency checks at the storage provider level.

## RecordExists {#recordexists-0212766d}

[Dedicated page](/orleans/docs/api/csharp/microsoft.orleans.core/orleans.grainstate-1/properties/recordexists-0212766d/)

[Source](https://github.com/dotnet/orleans/blob/e4e752cedecc2976811db49802c7a999b1f1c704/src/Orleans.Core/CodeGeneration/IGrainState.cs)

```csharp
[Orleans.Id(2)]
public bool RecordExists
```

Gets or sets a value indicating whether the record exists in storage.

## State {#state-ada61511}

[Dedicated page](/orleans/docs/api/csharp/microsoft.orleans.core/orleans.grainstate-1/properties/state-ada61511/)

[Source](https://github.com/dotnet/orleans/blob/e4e752cedecc2976811db49802c7a999b1f1c704/src/Orleans.Core/CodeGeneration/IGrainState.cs)

```csharp
[Orleans.Id(0)]
public T State
```

Gets or sets the state.
