Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
160573 stories
·
33 followers

Microsoft discloses Azure revenue as part of major financial reporting changes

1 Share
Vector illustration of the Microsoft logo.

Microsoft is changing how it reports its finances to investors by splitting its businesses into two segments and disclosing quarterly revenue for its Azure cloud business for the first time. The changes are meant to reflect the ongoing impact of AI on Microsoft and how the company now operates.

The software giant has previously reported revenue from three segments: Productivity and Business Processes, Intelligent Cloud, and More Personal Computing. This is now simplifying to two: Agents and Infra, and Devices and Consumer.

Devices and Consumer will include search and advertising revenues from LinkedIn and search advertising, as well as rev …

Read the full story at The Verge.

Read the whole story
alvinashcraft
41 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Qualtrics cut 117 jobs tied to Seattle headquarters, new filing shows

1 Share
Qualtrics Tower in downtown Seattle. (GeekWire File Photo)

Qualtrics is cutting 117 jobs connected to its Seattle headquarters, according to a state filing that provides new details of the layoffs that the experience management technology company made two weeks ago.

Engineering and product teams were hit hard. The filing lists software roles from entry-level through principal engineers, plus testing, machine learning, network and information security positions; engineering managers and directors; and product and product marketing managers.

The employees work at or report into Qualtrics Tower at 1201 Second Ave., the filing says.

The company, which has dual headquarters in Seattle and Provo, Utah, made cuts globally on Aug. 19, so the Seattle number reflects only a portion of the overall positions impacted. The company has not disclosed the total. We followed up again Wednesday to ask for an overall number.

Qualtrics employed about 900 people in Seattle as of 2023 and has not disclosed a figure since.

It’s part of a steady stream of tech layoffs in the Seattle region. Amazon disclosed 121 job cuts in Washington state on Aug. 31, T-Mobile 77 on Aug. 26, and TikTok 75 in Bellevue on Aug. 19. Zillow cut more than 500 Seattle jobs in early August.

Earlier this year, Meta cut nearly 1,400 jobs in the state, about 20% of its local workforce; Microsoft cut 605; and Oracle 491.

Qualtrics makes software that companies use to collect and analyze feedback from customers, employees, partners and others — a category that Qualtrics calls experience management. It was founded in Provo in 2002 and later added a Seattle headquarters.

The layoffs followed the company’s $6.75 billion acquisition of Press Ganey Forsta, an Indiana-based healthcare data company, which closed in May.

In a memo to employees on Aug. 19, CEO Jason Maynard said the deal brought together “two organizations, two sets of teams, two structures built independently,” and that the company had gone “function by function, team by team, to understand where we have overlap.”

Maynard became CEO in February, joining from Oracle. In April he removed five senior executives and reorganized teams across marketing, customer operations, IT and corporate development.

Qualtrics has been owned by Silver Lake and Canada Pension Plan Investment Board since they took it private for $12.5 billion in 2023. The company cut about 780 jobs, roughly 14% of its workforce, in October 2023, and about 270 earlier the same year.

Read the whole story
alvinashcraft
42 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Global Heating Will Hit At Least 1.8C, UN Warns, and There Are 'No Good Outcomes'

1 Share
An anonymous reader quotes a report from The Guardian: Global heating will reach at least 1.8C under even the most optimistic future, well beyond the Paris agreement goal of 1.5C, according to a UN report that warns every fraction of temperature rise intensifies destructive extreme weather, glacier melt, ecosystem loss, and island and coastal city submersion. The report by the Nairobi-based UN Environment Program confirmed overshooting the 1.5C goal inscribed in the landmark Paris agreement of 2015 was now "unavoidable" and, despite some progress in addressing the human-caused climate crisis driven by burning fossil fuels, likely in the next few years. It said: "There are no good outcomes above 1.5C." Heating of up to 3C above preindustrial levels could lead to glaciers losing more than a quarter of their mass by 2100, raising sea levels by up to 13cm. Global food production could decline by up to 14% by 2050 if there are not effective strategies to adapt. Human health, water supplies, nature, cities, infrastructure and economies could all be severely damaged. Some losses would be irreversible. Many communities may have to relocate or change their livelihoods. The report said the best hope for humanity to limit damage was to adopt an "overshoot, peak and decline" pathway that required immediate and sustained greenhouse gas emissions cuts combined with steps to remove carbon dioxide from the atmosphere. It described the goal of net zero emissions -- increasingly politically contentious in some countries -- as "an essential milestone that cannot be skipped" and stressed carbon dioxide removal through steps such as establishing vast new forests must occur alongside, not as an alternative to, deep cuts in fossil pollution. Crucially, the authors of the report, titled Limiting Overshoot, said the average global temperature could be returned to 1.5C this century only if heating stayed below about 1.8C. They warned nature's capacity to store carbon was uncertain and would shrink the more the planet heats. [...] The report's authors cited earlier work that found limiting heating to about 1.8C required global emissions to be halved by 2035. They said existing national policies were projected to lead to at least 2.3C heating, but it would still be possible to limit stay below 2C if countries delivered on net zero emissions commitments by mid-century.

Read more of this story at Slashdot.

Read the whole story
alvinashcraft
42 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Microsoft Announces Major Overhaul of its Financial Reporting

1 Share

The change appears to be a response to people like me who have been sounding the alarm on the company's lack of transparency for many years.

The post Microsoft Announces Major Overhaul of its Financial Reporting appeared first on Thurrott.com.

Read the whole story
alvinashcraft
42 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

The economics of agent scale: tokens, ROI, and building platforms for AI-first teams (Part 2)

1 Share
Andi Gutmans, head of Agentic Data Cloud at Google, returns for the second half of his Leaders of Code conversation to talk through the cost and infrastructure side of agentic development. ICYMI, part one covered judgment, code review, and data activation.
Read the whole story
alvinashcraft
43 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

C♯ 14 Extension Types and Static Members - Next-Gen Extension Architecture for Clean .NET 10 Code

1 Share

Ever since C# 3.0 introduced extension methods alongside LINQ, developers have relied on the this parameter modifier on static methods to augment existing types without altering their source code or inheriting from them. While this approach revolutionized fluent collection querying, it remained confined strictly to instance methods, leaving properties, indexers, static factories, and user-defined operators out of reach.

 

With the release of C# 14 running on the .NET 10 LTS runtime—and early previews of C# 15 exploring extension indexers on .NET 11—Microsoft has delivered a comprehensive paradigm shift: Extension Member Declarations. In this architectural guide, we explore the new extension block syntax, implement extension properties and static factory members, examine Roslyn Intermediate Language (IL) emission, and demonstrate how this next-generation capability refactors enterprise domain logic into clean, decoupled architectures.

 

C# 14 Extension Types and Static Members in .NET 10
Mastering C# 14 extension declarations, extension properties, and static members for clean architecture in .NET 10.

 

Table of Contents

 

  • Beyond Extension Methods: C# 14 introduces first-class extension blocks, allowing developers to define instance extension properties, instance extension methods, static member methods, static properties, and overloaded operators within a unified declaration scope.
  • Dedicated Receiver Scoping: The new extension(Type receiver) syntax declares the target type and receiver parameter once for the entire block, eliminating repetitive this Type parameter signatures across multiple method declarations.
  • Static Member Invocation: For the first time in C#, developers can attach static extension methods and properties directly to existing types (e.g., calling IEnumerable<int>.Generate(1, 10, 2) or string.EmptyGuid) without needing instance references.
  • 100% Binary Compatibility: C# 14 extension members compile down to standard CLI static methods and property accessors decorated with compiler attributes, guaranteeing seamless source and binary interoperability with earlier C# versions.
  • Future-Ready Language Roadmap: Modern enterprise codebases targeting .NET 10 LTS can adopt C# 14 extension members immediately, with preview support in C# 15 / .NET 11 expanding into extension indexers (this[int index]).

 

The Evolution of Extensions - From C# 3.0 Methods to C# 14 Member Declarations

For nearly two decades, C# extension methods served as an essential syntactic sugar mechanism. By declaring a static method inside a nongeneric static class and decorating the first parameter with the this keyword, the compiler allowed developers to invoke the method using instance invocation syntax (object.ExtensionMethod()).

 

However, as software architecture evolved toward domain-driven design, immutable records, and expression-bodied functional pipelines—as demonstrated in our deep dive on C♯ 14 field-backed properties and enhanced pattern matching and high-performance C♯ zero-allocation memory practices—the limitations of classic extension methods became a frequent friction point:

 

// -------------------------------------------------------------
// BEFORE C# 14: Repetitive Static Class & 'this' Parameter Noise
// -------------------------------------------------------------
public static class LegacyStringExtensions
{
    // Method verb used where a property noun is naturally expected
    public static bool IsBlank(this string? source) 
        => string.IsNullOrWhiteSpace(source);

    public static string Truncate(this string source, int maxLength) 
        => source.Length <= maxLength ? source : source[..maxLength];

    // Cannot define static factory methods on 'string' directly!
    // Cannot define extension properties!
}

// -------------------------------------------------------------
// AFTER C# 14: Clean, Unified Extension Block Declaration
// -------------------------------------------------------------
public static class ModernStringExtensions
{
    extension(string source)
    {
        // 1. Natural Instance Extension Property
        public bool IsBlank => string.IsNullOrWhiteSpace(source);

        // 2. Instance Extension Method (source is automatically in scope)
        public string Truncate(int maxLength) 
            => source.Length <= maxLength ? source : source[..maxLength];
    }

    // 3. Static Type Extension (no instance receiver needed)
    extension(string)
    {
        public static string RandomNonce => Guid.NewGuid().ToString("N");
    }
}

 

In C# 14, extension members elevate extensions from an ad-hoc method hack into a structured type-extension architecture, allowing developers to extend external libraries, BCL interfaces, and immutable data contracts with full syntactic parity.

 

 

Anatomy of C# 14 Extension Blocks - Receivers, Properties, and Syntax

Starting with C# 14 in .NET 10, top-level nongeneric static classes can host one or more extension blocks. An extension block declares the target type and binds a receiver parameter that remains in scope across all instance members declared within that block.

 

Let us examine an architectural implementation extending collections with statistical domain properties, calculation methods, and user-defined operators:

 

using System;
using System.Collections.Generic;
using System.Linq;

/// <summary>
/// Contains C# 14 extension members for numeric collections.
/// </summary>
public static class NumericSequenceExtensions
{
    /// <summary>
    /// Defines instance extensions for integer sequences.
    /// </summary>
    /// <param name="sequence">The sequence receiver instance.</param>
    extension(IEnumerable<int> sequence)
    {
        /// <summary>
        /// Extension property calculating median value on demand.
        /// </summary>
        public int Median
        {
            get
            {
                var sorted = sequence.OrderBy(x => x).ToList();
                if (sorted.Count == 0) return 0;
                int mid = sorted.Count / 2;
                return (sorted.Count % 2 == 0) ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
            }
        }

        /// <summary>
        /// Extension property checking emptiness without LINQ Any() overhead.
        /// </summary>
        public bool IsEmpty => !sequence.Any();

        /// <summary>
        /// Instance extension method applying an addition scalar.
        /// </summary>
        public IEnumerable<int> AddScalar(int scalar)
        {
            foreach (var item in sequence)
            {
                yield return item + scalar;
            }
        }

        /// <summary>
        /// User-defined static operator method concatenating two integer sequences.
        /// </summary>
        public static IEnumerable<int> operator +(IEnumerable<int> left, IEnumerable<int> right)
            => left.Concat(right);
    }
}

 

Notice how consumer code interacts with these members. To the caller, Median and IsEmpty feel like native instance properties, while the + operator allows natural mathematical syntax:

 

// Consuming C# 14 Extension Members
IEnumerable<int> scores = [85, 92, 78, 95, 88];

// 1. Calling Extension Property
int medianScore = scores.Median; // Evaluates smoothly like a native property

// 2. Calling Extension Method
var adjustedScores = scores.AddScalar(5);

// 3. Using Overloaded Operator Extension
IEnumerable<int> bonusScores = [100, 98];
var allScores = scores + bonusScores; // Concatenates sequences using '+'

 

 

Static Extension Members and User-Defined Operators Directly on Types

One of the most consequential enhancements in C# 14 is the ability to declare static extension members that are invoked directly on the extended type itself, rather than requiring an instantiated object.

 

When declaring static-only extensions, the receiver parameter name is omitted from the extension declaration because no instance receiver is needed. You declare factory methods, identity elements, and singleton constants directly on the type:

 

public static class CollectionTypeExtensions
{
    /// <summary>
    /// Provides static factory extensions directly on the IEnumerable<int> interface type.
    /// </summary>
    extension(IEnumerable<int>)
    {
        /// <summary>
        /// Static factory method generating a stepped arithmetic progression.
        /// </summary>
        public static IEnumerable<int> Generate(int start, int count, int step)
        {
            for (int i = 0; i < count; i++)
            {
                yield return start + (i * step);
            }
        }

        /// <summary>
        /// Static extension property providing an empty identity sequence.
        /// </summary>
        public static IEnumerable<int> Identity => Enumerable.Empty<int>();
    }
}

// -------------------------------------------------------------
// Usage: Invoked directly on the type itself!
// -------------------------------------------------------------
var progression = IEnumerable<int>.Generate(start: 10, count: 5, step: 2);
// Output: 10, 12, 14, 16, 18

var empty = IEnumerable<int>.Identity;

 

This capability solves a long-standing architectural limitation in C#. Previously, if you wanted a factory method for an interface like IRepository<T> or IValidator<T>, you had to invent arbitrary helper classes like RepositoryFactory or ValidatorHelper. In C# 14, factory methods can live on the interface or class type itself.

 

 

Generic Extension Blocks and Type Parameter Scoping Rules

In enterprise systems, extension members must handle generic types with precision. C# 14 establishes clear scoping rules for generic type parameters:

 

  • Receiver Type Parameters: Defined on the extension<TReceiver> declaration itself when the type parameter participates in the receiver type definition.
  • Member Type Parameters: Defined on the specific member signature when the type parameter is auxiliary and distinct from the receiver.
  • No Redundant Re-declaration: A member cannot re-declare a type parameter already scoped by its containing extension block.

 

public static class GenericPipelineExtensions
{
    /// <summary>
    /// Generic extension block scoped to any IEnumerable<TSource>.
    /// </summary>
    extension<TSource>(IEnumerable<TSource> source)
    {
        // 1. Member using the receiver's scoped type parameter TSource
        public IEnumerable<TSource> Slice(int skip, int take) 
            => source.Skip(skip).Take(take);

        // 2. Member introducing an auxiliary type parameter TResult for transformation
        public IEnumerable<TResult> Transform<TResult>(Func<TSource, TResult> selector)
        {
            foreach (var item in source)
            {
                yield return selector(item);
            }
        }

        // 3. Static extension property for any generic closed type
        public static IEnumerable<TSource> Empty => Enumerable.Empty<TSource>();
    }
}

// -------------------------------------------------------------
// Usage across diverse enterprise domain models
// -------------------------------------------------------------
List<string> names = ["Kunal", "Chowdhury", "Enterprise", "DotNet"];
var sliced = names.Slice(skip: 1, take: 2);
var lengths = names.Transform(name => name.Length);

var defaultStringSequence = IEnumerable<string>.Empty;

 

 

Enterprise Clean Architecture - Domain Modeling Without DTO Pollution

In clean and hexagonal software architectures, keeping core domain entities and data transfer objects (DTOs) decoupled from presentation formatting, UI bindings, and transport protocols is essential.

 

Frequently, engineering teams corrupt pure domain records by adding serialization helpers, currency formatters, and status calculation properties. With C# 14 extension members, you can keep domain entities strictly focused on state, while cleanly attaching context-specific properties in separate architectural layers:

 

// Core Domain Layer (Pure, lightweight record DTO)
namespace Enterprise.Domain.Orders;

public record Order(
    Guid Id,
    string CustomerName,
    decimal TotalAmount,
    OrderStatus Status,
    DateTime CreatedAtUtc
);

public enum OrderStatus { Pending, Processing, Shipped, Delivered, Cancelled }

// =============================================================
// Presentation / API Gateway Layer (Extensions decoupled from Domain)
// =============================================================
namespace Enterprise.Api.Presenters;

public static class OrderPresentationExtensions
{
    extension(Order order)
    {
        /// <summary>
        /// Extension property formatting localized financial currency.
        /// </summary>
        public string FormattedTotal => $"₹{order.TotalAmount:N2}";

        /// <summary>
        /// Extension property evaluating business SLAs.
        /// </summary>
        public bool IsOverdue => 
            order.Status != OrderStatus.Delivered && 
            DateTime.UtcNow - order.CreatedAtUtc > TimeSpan.FromDays(3);

        /// <summary>
        /// Extension property generating a deterministic UI badge color.
        /// </summary>
        public string StatusBadgeColor => order.Status switch
        {
            OrderStatus.Delivered => "badge-emerald",
            OrderStatus.Cancelled => "badge-rose",
            OrderStatus.Processing => "badge-amber",
            _ => "badge-slate"
        };
    }
}

 

This design maintains absolute domain purity. The Order entity remains lightweight, serialization-safe, and independent of external presentation libraries.

 

 

IL Emission, Binary Compatibility, and Zero-Cost Runtime Performance

A critical concern when adopting new language syntax in high-throughput enterprise systems is runtime overhead. Does C# 14 introduce virtual dispatch tables, delegate allocation, or reflection?

 

The answer is zero runtime overhead. The Roslyn compiler compiles extension blocks directly down into standard static methods in the generated Intermediate Language (IL). An extension property getter is emitted as a standard static method with an [Extension] metadata attribute, identical to classic C# extension methods.

 

// Conceptual C# Equivalent of Roslyn IL Emission

// C# 14 Source:
// public bool IsBlank => string.IsNullOrWhiteSpace(source);

// Decompiled IL Equivalent:
[Extension]
[CompilerGenerated]
public static bool get_IsBlank(string source)
{
    return string.IsNullOrWhiteSpace(source);
}

 

Because the generated bytecode consists of direct static call opcodes (call rather than callvirt), the .NET 10 Tier-1 JIT compiler can inline extension properties and methods with zero pointer indirection. As discussed in our benchmarks on modern C♯ lock objects and params collections and building productivity tools with Visual Studio 2026 developer productivity tools, extension members achieve complete zero-cost abstraction.

 

 

Frequently Asked Questions (FAQ)

1. What are C# 14 extension members?

C# 14 extension members expand C#'s extension capabilities beyond static methods, allowing developers to define instance extension properties, static methods, static properties, and overloaded operators inside dedicated extension blocks.

 

2. How do you declare an extension block in C# 14?

Inside a top-level nongeneric static class, you declare an extension block using the syntax extension(Type receiverName) { ... } for instance members, or extension(Type) { ... } for static members.

 

3. Can C# 14 extension properties have both getters and setters?

Yes. Extension properties support get-only accessors, expression-bodied getters, and full get/set accessor pairs, provided the setter modifies reachable state on the receiver.

 

4. Are C# 14 extension members backward compatible with older C# code?

Yes. Extension members compile to standard static methods in the generated IL. Callers using earlier C# versions can invoke them as conventional static methods without breaking binary compatibility.

 

5. Can I define static factory methods on interfaces using C# 14?

Yes. Using static extension blocks extension(IMyInterface), you can attach static factory methods and properties that are invoked directly on the interface type (e.g., IEnumerable<int>.Generate(...)).

 

6. What is the performance cost of using C# 14 extension properties?

There is zero runtime overhead. Extension properties compile to static method calls that the .NET JIT compiler easily inlines, avoiding heap allocations or virtual dispatch overhead.

 

7. Does C# 14 support extension indexers?

Initial C# 14 releases focused on properties, methods, and static operators. Extension indexers (public T this[int index]) are part of the active C# 15 preview language specification in .NET 11.

 

8. Can extension members access private or protected fields of the extended class?

No. Extension members obey standard accessibility rules and can only access public or internal members exposed by the target type.

 

9. How does Visual Studio 2026 support C# 14 extension members?

Visual Studio 2026 provides native IntelliSense, code completion, Roslyn refactoring tools to convert legacy extension methods into extension blocks, and full debugger integration.

 

10. Can extension blocks be used on open generic types?

Yes. You can declare generic extension blocks such as extension<T>(IEnumerable<T> source), allowing members to operate fluently across all closed implementations.

 

 

End Note

The introduction of extension members in C# 14 marks a significant milestone in the language's ongoing quest for expressive, clean, and mechanical sympathetic syntax. By providing a natural syntax for extension properties, static members, and overloaded operators, C# eliminates decades-old workarounds and boilerplate code.

 

For software architects and enterprise engineering teams building upon .NET 10 LTS, adopting extension blocks allows clean domain-driven boundaries to flourish without sacrificing runtime throughput or memory efficiency.

 

As you refactor existing utilities and design new microservices, leveraging C# 14 extension declarations will ensure your codebase remains maintainable, performant, and aligned with modern .NET best practices.

 

Read the whole story
alvinashcraft
43 minutes ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories