GLM 4.5 Air

C# string vs String: Complete Guide

Learn the key differences between string and String in C#. Discover when to use each, performance implications, and best practices for C# development. Master string types today!

Question

What is the difference between String and string in C#? What are the differences between these two, and which one should I use?

csharp
string s = "Hello world!";
String s = "Hello world!";
GLM 4.5 Air

Brief Answer

In C#, string and String refer to the same type - String is the actual .NET Framework class name from the System namespace, while string is a C# keyword alias for System.String. For C# development, you should prefer using string as it follows C# language conventions and improves code readability.

Contents

Fundamental Difference Between string and String

In C#, string and String are two ways to reference the exact same data type - the string type that represents a sequence of Unicode characters. The key difference lies in their origin:

  • String is the actual class name defined in the System namespace within the .NET Framework
  • string is a C# language-specific keyword that serves as an alias for System.String
csharp
// These two statements are completely equivalent
string str1 = "Hello";
System.String str2 = "Hello";

// Both variables reference the same type
Console.WriteLine(str1.GetType() == str2.GetType()); // Outputs: True

The C# language designers created the string keyword to provide a more natural and consistent experience for C# developers, aligning with C# naming conventions where primitive types are represented by lowercase keywords (int, bool, float, etc.).


Practical Usage and Naming Conventions

When writing C# code, the choice between string and String often comes down to style conventions and personal/team preferences:

C# Naming Convention

The official C# language guidelines recommend using string because:

  • It follows C# language conventions where keywords are lowercase
  • It maintains consistency with other C# primitive types (int, bool, double, etc.)
  • It improves code readability for C# developers
csharp
// Recommended C# style
public string GetUserName(int userId)
{
    // Method implementation
    return string.Empty;
}

.NET Framework Convention

The .NET Framework itself uses String in its class libraries and documentation:

  • All .NET classes use PascalCase naming
  • This maintains consistency across the entire .NET ecosystem
csharp
// Examples from .NET Framework
public string Format(string format, object arg0) => String.Format(format, arg0);
public bool Equals(string value) => String.Equals(this, value);

Mixed Usage Considerations

While both are technically correct, mixing them in the same codebase can reduce readability:

csharp
// Less consistent style - mixing both conventions
public String ProcessString(String input)
{
    if (string.IsNullOrEmpty(input))
    {
        return String.Empty;
    }
    
    return input.Trim().ToLower();
}

When to Use String Over string

Although string is generally preferred in C# code, there are specific scenarios where using String might be more appropriate:

Cross-Language .NET Development

When working with multiple .NET languages (e.g., C# and VB.NET), using String provides consistency:

csharp
// In a shared library used by multiple .NET languages
public static class StringExtensions
{
    // More recognizable across .NET languages
    public static bool IsNullOrWhiteSpace(String value)
    {
        return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
    }
}

Reflection and Type Checking

When using reflection or working with type objects, you’ll need to use the full type name:

csharp
// Using reflection requires the full type name
Type stringType = typeof(String); // or typeof(string)
MethodInfo method = stringType.GetMethod("Contains");

Generic Constraints

In some generic constraint scenarios, especially when interfacing with other .NET languages:

csharp
public class StringContainer<T> where T : String
{
    // More explicit constraint
}

Documentation and Comments

When writing documentation that might be read by developers from different .NET language backgrounds, using String can be clearer:

csharp
/// <summary>
/// Converts a String representation to a custom format.
/// </summary>
/// <param name="input">The String to convert.</param>
/// <returns>The formatted String.</returns>
public static String ConvertFormat(String input)
{
    // Implementation
}

Performance and Compilation Differences

Compilation Process

During compilation, the C# compiler treats string and String identically. The compiler simply replaces all instances of string with System.String before generating the IL code.

csharp
// Both of these compile to identical IL code
string s1 = "test";
String s2 = "test";

Performance Implications

There are no performance differences between using string or String at runtime:

  • The generated IL code is identical
  • The JIT compilation process treats them the same
  • Memory usage and execution performance are exactly the same

IntelliSense and Editor Support

Modern IDEs like Visual Studio treat both keywords identically in terms of:

  • IntelliSense suggestions
  • Error checking
  • Refactoring support
  • Navigation features

Best Practices and Recommendations

Official Guidelines

According to Microsoft’s C# coding conventions:

  • Use string for all C# code unless specifically working with reflection or interfacing with other .NET languages
  • Maintain consistency within your codebase - don’t mix both styles without a clear reason

Team Development

In team environments:

  1. Establish a clear convention and document it in your coding standards
  2. Use your IDE’s search and replace functionality to maintain consistency
  3. Configure code analysis tools to enforce your chosen convention

Project Considerations

Consider the context of your project:

  • For C#-specific projects, prefer string
  • For shared .NET libraries, consider String for cross-language compatibility
  • For public APIs, consider String to be more familiar to developers from other .NET languages

Readability and Maintainability

Ultimately, the choice should prioritize:

  • Code readability for your target audience
  • Consistency within your codebase
  • Long-term maintainability
csharp
// Consistent use of string in C#-specific code
public class UserService
{
    private readonly List<string> _userNames = new List<string>();
    
    public string GetUserName(int userId)
    {
        return _userNames.FirstOrDefault() ?? string.Empty;
    }
    
    public void AddUserName(string userName)
    {
        if (!string.IsNullOrEmpty(userName))
        {
            _userNames.Add(userName);
        }
    }
}

Common Mistakes and Clarifications

Misconception About Different Types

A common misconception is that string and String are different types. They are exactly the same type - just different ways to reference it.

csharp
// This comparison will always be true
string s1 = "test";
String s2 = "test";
bool areSame = s1.GetType() == s2.GetType(); // True

Case Sensitivity

Remember that C# is case-sensitive, so String and string are different from STRING or String (with different casing).

csharp
// These are all different and will cause compilation errors
string s1 = "test";
String s2 = "test";
STRING s3 = "test"; // Compilation error
string S4 = "test"; // Different variable, but confusing

Using Both in the Same Context

Avoid using both in close proximity as it can confuse readers:

csharp
// Less clear - using both unnecessarily
public String ProcessString(string input)
{
    String result = String.Format("Processed: {0}", input);
    return result.ToString();
}

Nullable Reference Types

With nullable reference types in C# 8.0 and later, the same principles apply:

csharp
// Both are valid for nullable reference types
string? nullableString = null;
String? nullableString2 = null;

Conclusion

The difference between string and String in C# is primarily syntactic rather than functional. Here are the key takeaways:

  1. string is a C# keyword alias for System.String, while String is the actual .NET type name
  2. For C# development, prefer string as it follows C# language conventions and improves consistency
  3. Use String when working across multiple .NET languages or with reflection scenarios
  4. There are no performance differences between the two - they compile to identical code
  5. Maintain consistency within your codebase, avoiding unnecessary mixing of both styles

When starting a new C# project, the recommendation is simple: use string for your C# code unless you have a specific reason to use String. This approach aligns with C# language design principles and makes your code more readable to other C# developers.